考虑不断变化的路径

cry*_*ice 2 python file path

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

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

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

Ali*_*har 5

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

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

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

  1. os.path- 具有大量跨平台路径操作的标准库模块。你最好的朋友。我曾经在一本书上读到过“遵循 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
Run Code Online (Sandbox Code Playgroud)

并运行它:

ali@work:~/tmp$ python script1.py 
/home/ali/tmp/script2.py
Run Code Online (Sandbox Code Playgroud)

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

如果您始终绝对传递路径,则永远不会遇到工作目录问题。