简单的答案:你根据环境计算出绝对路径。
你真正需要的是一些指示。您可以从标准库中的各个位置收集各种运行时和环境信息(当我想在 Windows 上部署应用程序时,它们肯定会帮助我)。
所以,首先是一些一般性的事情:
os.path- 具有大量跨平台路径操作的标准库模块。你最好的朋友。我曾经在一本书上读到过“遵循 os.path”。__file__- 当前模块的位置。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就是一个例子。
如果您始终绝对传递路径,则永远不会遇到工作目录问题。