如何正确确定当前脚本目录?

2024-09-25 16:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想看看在python中确定当前脚本目录的最佳方法是什么?

我发现,由于调用python代码的方法很多,很难找到一个好的解决方案。

以下是一些问题:

  • ^如果使用execexecfile执行脚本,则不定义{}
  • __module__仅在模块中定义

用例:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py')(来自另一个脚本,它可以位于另一个目录中,并且可以有另一个当前目录。

我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法。

最常用的方法是os.path.dirname(os.path.abspath(__file__)),但如果您使用exec()从另一个脚本执行脚本,则此方法实际上不起作用。

警告

任何使用当前目录的解决方案都将失败,这可能因调用脚本的方式不同而不同,也可能在运行的脚本中更改。


Tags: 模块path方法代码py目录脚本定义
3条回答
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__的解决方案将失败),那么它就可以工作。如果脚本在an executable zip file (/an egg)中,它就可以工作。如果脚本是从zip文件“导入”(PYTHONPATH=/path/to/library.zip python -mscript_to_run)的,那么它可以工作;在本例中,它返回存档路径。如果脚本被编译成独立的可执行文件(sys.frozen),它就可以工作。它适用于符号链接(realpath消除符号链接)。它在交互式解释器中工作;在本例中,它返回当前工作目录。

相关问题 更多 >