我想看看在python中确定当前脚本目录的最佳方法是什么?
我发现,由于调用python代码的方法很多,很难找到一个好的解决方案。
以下是一些问题:
exec
,execfile
执行脚本,则不定义{__module__
仅在模块中定义用例:
./myfile.py
python myfile.py
./somedir/myfile.py
python somedir/myfile.py
execfile('myfile.py')
(来自另一个脚本,它可以位于另一个目录中,并且可以有另一个当前目录。我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法。
最常用的方法是os.path.dirname(os.path.abspath(__file__))
,但如果您使用exec()
从另一个脚本执行脚本,则此方法实际上不起作用。
任何使用当前目录的解决方案都将失败,这可能因调用脚本的方式不同而不同,也可能在运行的脚本中更改。
是你能得到的最好的。
使用
exec
/execfile
执行脚本是不寻常的;通常应该使用模块基础结构来加载脚本。如果必须使用这些方法,我建议在传递给脚本的globals
中设置__file__
,以便脚本可以读取该文件名。在execed代码中没有其他方法可以获得文件名:正如您所注意到的,CWD可能位于完全不同的位置。
如果您真的想讨论通过
execfile(...)
调用脚本的情况,可以使用inspect
模块来推断文件名(包括路径)。据我所知,这将适用于您列出的所有情况:它对CPython,Jython,Pypy有效。如果使用
execfile()
执行脚本(这里基于sys.argv[0]
和__file__
的解决方案将失败),那么它就可以工作。如果脚本在an executable zip file (/an egg)中,它就可以工作。如果脚本是从zip文件“导入”(PYTHONPATH=/path/to/library.zip python -mscript_to_run
)的,那么它可以工作;在本例中,它返回存档路径。如果脚本被编译成独立的可执行文件(sys.frozen
),它就可以工作。它适用于符号链接(realpath
消除符号链接)。它在交互式解释器中工作;在本例中,它返回当前工作目录。相关问题 更多 >
编程相关推荐