[我原来的帖子,不可原谅地从第二段中省略了“不”(现在在下面强调)这个词。]
Python是否提供了一种访问当前进程的初始工作目录的稳定方法?
(请注意,解决方案可能 NOT 会假设与程序启动相关的执行时间。
我能想到的唯一方法就是:
import os
def getiwd():
return os.environ['PWD']
...这是相当蹩脚的,即使在Windows下放弃其可行性问题,因为代码的任何其他部分(例如客户端代码或其加载的其他模块)可以自由修改{{ 1}}。 IOW,它“不稳定”。
答案 0 :(得分:1)
你应该获得“初始”工作目录的方法是最初获取它并将其保存在其他地方。为此目的,除了您可能知道的os.getcwd()
之外,不需要任何其他内容。
没有理由让语言以任何其他方式提供它 - 当前的工作目录应该是可以改变的。
答案 1 :(得分:-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()
启动工作,您可以看到您还必须解析脚本名称的主要路径 - 更多工作....
更多this SO post。