我想知道在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()从另一个脚本执行脚本,这就行不通了。
警告
任何使用当前目录的解决方案都会失败,这可以根据脚本调用的方式有所不同,也可以在运行的脚本中更改。
要获得包含当前脚本的目录的绝对路径,您可以使用:
from pathlib import Path
absDir = Path(__file__).parent.resolve()
请注意,.resolve()调用是必需的,因为它使路径成为绝对路径。如果没有resolve(),您将获得类似于'.'的东西。
这个解决方案使用pathlib,它自v3.4(2014)以来一直是Python的stdlib的一部分。与使用os的其他解决方案相比,这是更可取的。
官方的pathlib文档有一个有用的表,将旧的操作系统函数映射到新函数:https://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module
在Python 3.4+中,你可以使用更简单的pathlib模块:
from inspect import currentframe, getframeinfo
from pathlib import Path
filename = getframeinfo(currentframe()).filename
parent = Path(filename).resolve().parent
你也可以使用__file__(当它可用时)来完全避免inspect模块:
from pathlib import Path
parent = Path(__file__).resolve().parent