我想看看在Python中确定当前脚本目录的最佳方法是什么。
我发现,由于调用Python代码的方式很多,很难找到一个好的解决方案。
以下是一些问题:
如果使用模块执行脚本,则不定义
__file__
;如果仅在execfile
__module__
中定义模块,则不定义exec
使用案例:
./myfile.py
python myfile.py
./somedir/myfile.py
python somedir/myfile.py
execfile('myfile.py')
(来自另一个脚本,可以位于另一个目录中,并且可以拥有另一个当前目录。我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法。
最常用的方法是os.path.dirname(os.path.abspath(__file__))
,但是如果您使用exec()
从另一个脚本执行脚本,那么这种方法就不起作用了。
警告
任何使用当前目录的解决方案都将失败,这可能会根据脚本的调用方式而有所不同,也可以在运行的脚本中进行更改。
发布于 2010-09-15 23:01:21
os.path.dirname(os.path.abspath(__file__))
确实是你能得到的最好的。
使用exec
/execfile
执行脚本并不常见;通常情况下,您应该使用模块基础设施来加载脚本。如果必须使用这些方法,我建议在传递给脚本的globals
中设置__file__
,以便脚本可以读取该文件名。
没有其他方法可以在可执行代码中获取文件名:正如您所注意到的,CWD可能位于完全不同的位置。
发布于 2011-06-02 10:49:46
如果您真的想介绍通过execfile(...)
调用脚本的情况,可以使用inspect
模块来推断文件名(包括路径)。据我所知,这将适用于您列出的所有案例:
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
发布于 2014-04-05 22:01:08
#!/usr/bin/env python
import inspect
import os
import sys
def get_script_dir(follow_symlinks=True):
if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
path = os.path.abspath(sys.executable)
else:
path = inspect.getabsfile(get_script_dir)
if follow_symlinks:
path = os.path.realpath(path)
return os.path.dirname(path)
print(get_script_dir())
它适用于CPython,Jython,Pypy。如果使用execfile()
执行脚本,则可以正常工作(sys.argv[0]
和__file__
-based解决方案在这里将失败)。如果脚本在an executable zip file (/an egg)中,它就会起作用。如果脚本是从压缩文件“导入”(PYTHONPATH=/path/to/library.zip python -mscript_to_run
)的,那么它就可以工作;在本例中,它返回归档路径。如果脚本被编译成独立的可执行文件(sys.frozen
),它就会起作用。它适用于符号链接(realpath
消除了符号链接)。它在交互式解释器中工作;在本例中,它返回当前的工作目录。
https://stackoverflow.com/questions/3718657
复制相似问题