1

[不可原谅的是,我原来的帖子在第二段中省略了“不”(现在在下面强调)这个词。]

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

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

我能想到的唯一方法是:

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

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

4

2 回答 2

1

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

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

于 2012-08-18T22:49:55.353 回答
-1

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

ini_path = os.getcwd()   

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

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

import sys, os, inspect
ini_path = os.getcwd()

def ppaths(d=''):
    print('sys.path[0]:     {}'.format(sys.path[0]))
    print('ini_path:        {}'.format(ini_path))
    print('os.getcwd:       {}'.format(os.getcwd())) 
    print('inspect.getfile: {}'.format(inspect.getfile(inspect.currentframe())))
    print('os.dirfile:      {}'.format(
               os.path.dirname(inspect.getfile(inspect.currentframe()))))
    if d:
        print('==== Changing to "{}" '.format(d))
        os.chdir(d)


print()
ppaths('/')
ppaths('Users')
ppaths()

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

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

更多在这个 SO 帖子中。

于 2012-08-18T22:45:49.140 回答