如何稳定获取初始绝对工作目录

2024-10-03 17:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

[我原来的帖子不可饶恕地在第二段中删去了“不”(现在着重强调)一词。]

Python是否提供了访问当前进程的初始工作目录的稳定方法?在

(请注意,该解决方案可能会假设与程序启动相关的任何执行时间。)

我能想到的唯一方法是:

import os
def getiwd():
    return os.environ['PWD']

…这是相当蹩脚的,即使我们把它在Windows下的生存能力问题放在一边,因为代码的任何其他部分(例如客户端代码或它加载的其他模块)都可以自由修改os.environ['PWD']。看,它是“不稳定的”。在


Tags: 方法代码import程序目录进程osdef
2条回答

对于启动工作目录(作为脚本的第一行):

ini_path = os.getcwd()   

对于脚本的路径,请使用sys.path[0]。在

测试代码(在家里试试看):

^{pr2}$

在我的系统上(从编辑器内部运行),打印:

sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /Users/andrew
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
==== Changing to "/" 
sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
==== Changing to "Users" 
sys.path[0]:     /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup
ini_path:        /Users/andrew
os.getcwd:       /Users
inspect.getfile: /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup/untitled text 3-367027656.416
os.dirfile:      /private/var/folders/00/kbqj5nt54m99z5gyffy8fksm0000gp/T/Cleanup At Startup

现在,从Bash运行它:

kitchen:SO andrew$ pwd
/Users/andrew/bin/SO
kitchen:SO andrew$ ls ins.py
ins.py
kitchen:SO andrew$ ./ins.py

sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /Users/andrew/bin/SO
inspect.getfile: ./ins.py
os.dirfile:      .
==== Changing to "/" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /
inspect.getfile: ./ins.py
os.dirfile:      .
==== Changing to "Users" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin/SO
os.getcwd:       /Users
inspect.getfile: ./ins.py
os.dirfile:      .
kitchen:SO andrew$ 

从Bash中的其他目录运行:

kitchen:SO andrew$ cd ..
kitchen:bin andrew$ ./SO/ins.py

sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /Users/andrew/bin
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO
==== Changing to "/" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO
==== Changing to "Users" 
sys.path[0]:     /Users/andrew/bin/SO
ini_path:        /Users/andrew/bin
os.getcwd:       /Users
inspect.getfile: ./SO/ins.py
os.dirfile:      ./SO

在所有情况下,sys.path[0]都指向启动脚本的绝对路径。在

为了使os.getcwd()在启动时工作,您可以看到您还必须解析脚本名称的前导路径更多工作。。。。在

更多信息请参见this SO post。在

获取“初始”工作目录的方法是首先获取它并将其保存到其他地方。为此,除了您可能知道的os.getcwd()之外,不需要任何东西。在

语言没有理由以其他方式提供它——当前的工作目录应该是可以更改的。在

相关问题 更多 >