Python 如何稳定地获得初始绝对工作目录

Python 如何稳定地获得初始绝对工作目录,python,cross-platform,working-directory,Python,Cross Platform,Working Directory,[不可原谅的是,我原来的帖子在第二段中漏掉了“不”(现在强调如下)一词。] Python是否提供了一种稳定的方式来访问当前进程的初始工作目录 (请注意,解决方案可能而不是假设与程序启动相关的执行时间。) 我能想到的唯一方法是: import os def getiwd(): return os.environ['PWD'] …这是相当蹩脚的,即使把它在Windows下的可行性问题放在一边,因为代码的任何其他部分(例如客户端代码或它加载的其他模块)都可以自由修改os.environ['P

[不可原谅的是,我原来的帖子在第二段中漏掉了“不”(现在强调如下)一词。]

Python是否提供了一种稳定的方式来访问当前进程的初始工作目录

(请注意,解决方案可能而不是假设与程序启动相关的执行时间。)

我能想到的唯一方法是:

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

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

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

对于脚本的路径,请使用

测试代码(请在家中尝试):

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

现在,从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()
,您可以看到还必须解析脚本名称的前导路径——更多工作


更多信息。

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


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

os.getcwd()对您不起作用吗?我想如果您在启动后更改目录,您必须自己保存它。@kjo:这应该是“可能不会假设”吗?@João如果任何地方的代码在你调用之前更改了工作目录,那么它就不起作用了。@Mechanicalsnail:没错!在我能做出的所有愚蠢的打字错误中,我设法做出了可能是最糟糕的一个。。。我希望我能取消帖子,重新开始。。。现在太晚了。我向那些徒劳回答的人道歉。@Amber:恕我直言,这是不正确的
sys.path[0]
指脚本的启动目录,除非脚本本身进行了更改。请参阅示例代码。
sys.path[0]
可能是空字符串——比如在Python shell中——因此要处理它,您可能需要
os.path.abspath(sys.path[0])
。另外
inspect.getfile((inspect.currentframe())
返回那里的
'
。@carrot top除了OP不是询问脚本的绝对路径,而是询问工作目录的初始值(并不总是脚本位置)。另外,
sys.path
也不能免于更改(与当前工作目录一样)。(请注意,即使在您
os.chdir()
之前,
os.getcwd()
sys.path[0]
的值也是不同的。)@martineau:您是正确的(与往常一样),但有一个简单的解决方法:
import\uu main\uuuuuuu作为main;print hasattr(main,“\uuuuu file”\uuuuuuu')
将告诉您是否在shell中。我为原始帖子中的错误表示歉意,因为它否定了我明确排除您给出的解决方案的意图。(另请参阅我对carrot top和Mechanical Snail的评论。)也就是说,我确实非常明确地指出,我希望在启动时使用工作目录。我不想要当前的工作目录。@kjo我知道你要的是什么。我的观点是,除了“在启动时获取当前工作目录并将其保存到其他地方”之外,没有其他方法可以获取“启动时的工作目录”。Python不会为您保留有关启动工作目录的数据。
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
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$ 
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