2

关于另一个问题,你如何解释可能改变的路径?例如,如果一个程序正在调用与该程序位于同一目录中的文件,您可以简单地使用 *nix 中的路径“.\foo.py”。然而,显然 Windows 喜欢硬编码路径,例如“C:\Python_project\foo.py”。

如果路径改变会发生什么?例如,文件可能不在 C: 驱动器上,而是在拇指驱动器或可以更改驱动器号的外部驱动器上。该文件可能仍与程序位于同一目录中,但与代码中的驱动器号不匹配。

我希望程序是跨平台的,但我希望我可能必须使用os.name或其他东西来确定要使用哪个路径代码块。

4

4 回答 4

5

简单回答:你根据环境算出绝对路径。

你真正需要的是一些指针。您可以从标准库的不同位置收集到各种运行时和环境信息(当我想在 Windows 上部署应用程序时,它们肯定会帮助我)。

所以,首先一些一般的事情:

  1. os.path- 具有大量跨平台路径操作的标准库模块。你最好的朋友。“Follow the os.path”我曾经在一本书中读过。
  2. __file__- 当前模块的位置。
  3. sys.executable- 正在运行的 Python 的位置。

现在你可以从这三个来源中收集到任何你想要的东西。os.path 中的函数将帮助您绕过树:

  • os.path.join('path1', 'path2')- 以跨平台方式加入路径段
  • os.path.expanduser('a_path')a_path-在用户的主目录中查找路径
  • os.path.abspath('a_path')- 将相对路径转换为绝对路径
  • os.path.dirname('a_path')- 获取路径所在的目录
  • 还有很多很多...

所以结合这个,例如:

# script1.py
# Get the path to the script2.py in the same directory
import os
this_script_path = os.path.abspath(__file__)
this_dir_path = os.path.dirname(this_script_path)
script2_path = os.path.join(this_dir_path, 'script2.py')
print script2_path

并运行它:

ali@work:~/tmp$ python script1.py 
/home/ali/tmp/script2.py

现在,对于您的具体情况,您似乎对“工作目录”和“脚本所在的目录”的概念有些混淆。这些可以相同,但也可以不同。例如,“工作目录”可以更改,因此使用它的函数有时可能会找到他们正在寻找的东西,但有时却找不到。subprocess.Popen就是一个例子。

如果您总是绝对传递路径,您将永远不会遇到工作目录问题。

于 2008-11-13T10:54:40.540 回答
0

如果您的文件始终与您的程序位于同一目录中,则:

def _isInProductionMode():
    """ returns True when running the exe, 
        False when running from a script, ie development mode.
    """
    return (hasattr(sys, "frozen") or # new py2exe
           hasattr(sys, "importers") # old py2exe
           or imp.is_frozen("__main__")) #tools/freeze

def _getAppDir():
    """ returns the directory name of the script or the directory 
        name of the exe
    """
    if _isInProductionMode():
        return os.path.dirname(sys.executable)
    return os.path.dirname(__file__)

应该管用。另外,我在自己的应用程序中使用了 py2exe,并没有使用其他 exe 转换应用程序对其进行测试。

于 2008-11-13T08:15:58.737 回答
0

什么 - 具体来说 - 您所说的“调用文件...foo.py”是什么意思?

  1. 进口?如果是这样,则路径完全在您的程序之外。在 shell 级别使用or或其他设置PYTHONPATH环境变量。例如,您可以编写 2 行 shell 脚本来设置环境变量并运行 Python。.c:\

    视窗

    SET PYTHONPATH=C:\path\to\library
    python myapp.py
    

    Linux

    export PYTHONPATH=./relative/path
    python myapp.py
    
  2. 执行文件?考虑使用导入。

  3. 阅读和评估?考虑使用导入。

如果 PYTHONPATH 太复杂,那么将你的模块放在 Python lib/site-packages 目录中,默认情况下它会放在 PYTHONPATH 中。

于 2008-11-13T10:54:11.430 回答
-1

我通过使用os.getcwd()弄清楚了。我还学习了如何使用os.path.join根据操作系统自动确定正确的路径格式。这是代码:

def openNewRecord(self, event): # wxGlade: CharSheet.<event_handler>
    """Create a new, blank record sheet."""
    path = os.getcwd()
    subprocess.Popen(os.path.join(path, "TW2K_char_rec_sheet.py"), shell=True).stdout

它似乎正在工作。感谢您的想法。

于 2008-11-13T13:37:10.313 回答