如何正确确定当前脚本目录?
我想看看在python中确定当前脚本目录的最佳方法是什么?
我发现这两种调用python代码的方法很多,很难找到一个好的解决方案。
这里有一些问题:
exec
, execfile
执行,则__file__
未定义 __module__
仅在模块中定义 用例:
./myfile.py
python myfile.py
./somedir/myfile.py
python somedir/myfile.py
execfile('myfile.py')
(来自另一个脚本,可以位于另一个目录中,并且可以有另一个当前目录。 我知道没有完美的解决方案,因为在某些情况下,我正在寻找解决大部分案例的最佳方法。
最常用的方法是os.path.dirname(os.path.abspath(__file__))
但如果使用exec()
从另一个脚本执行脚本,则这种方法无效。
警告
任何使用当前目录的解决方案都会失败,这可能会因脚本的调用方式而异,也可能在运行脚本中更改。
os.path.dirname(os.path.abspath(__file__))
确实是最好的你会得到。
用exec
/ execfile
执行一个脚本是很平常的; 通常您应该使用模块基础结构来加载脚本。 如果您必须使用这些方法,我建议在您传递给脚本的globals
设置__file__
,以便它可以读取该文件名。
没有其他方法可以在execed代码中获取文件名:正如您所看到的,CWD可能处于完全不同的位置。
如果您确实想要介绍通过execfile(...)
调用脚本的情况,则可以使用inspect
模块来推断文件名(包括路径)。 据我所知,这将适用于您列出的所有情况:
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
#!/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__
的解决方案将在这里失败)执行脚本,它将起作用。 如果脚本在可执行的zip文件(/蛋)内,它就可以工作。 如果脚本是从zip文件“导入”的( PYTHONPATH=/path/to/library.zip python -mscript_to_run
) 它会在这种情况下返回存档路径。 如果脚本被编译为独立的可执行文件( sys.frozen
), sys.frozen
。 它适用于符号链接( realpath
消除了符号链接)。 它在交互式解释器中工作。 它在这种情况下返回当前的工作目录。
上一篇: How to properly determine current script directory?
下一篇: Properly handling IOError thrown by logging.config.fileConfig?