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

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

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

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

以下是一些问题:

  • __file__

    如果脚本是用

    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().

警告

任何使用当前目录的解决方案都将失败,这可能根据脚本的调用方式而有所不同,或者在运行的脚本中进行更改。


Smart猫小萌
浏览 681回答 3
3回答

慕莱坞森

os.path.dirname(os.path.abspath(__file__))确实是你能得到的最好的。使用exec/execfile通常,您应该使用模块基础结构来加载脚本。如果必须使用这些方法,我建议设置__file__在globals您将传递给脚本,以便它能够读取该文件名。在执行代码中没有获得文件名的其他方法:正如您注意到的,CWD可能位于一个完全不同的位置

翻阅古今

如果您真的想讨论脚本被调用的情况,请通过execfile(...),您可以使用inspect模块来推导文件名(包括路径)。据我所知,这将适用于你列出的所有案件:filename = inspect.getframeinfo(inspect.currentframe()).filename path = os.path.dirname(os.path.abspath(filename))

慕沐林林

#!/usr/bin/env pythonimport inspectimport osimport sysdef 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__-基于基础的解决办法在此将失败)。如果脚本在里面,它就能工作。一个可执行的压缩文件(/一个鸡蛋)..如果脚本是“导入”的,它就能工作(PYTHONPATH=/path/to/library.zip python -mscript_to_run)从zip文件中返回存档路径(在本例中是这样的)。如果脚本被编译成独立的可执行文件(sys.frozen)。它适用于符号链接(realpath消除符号链接)。它在交互式解释器中工作;在本例中,它返回当前的工作目录。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python