为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Smart猫小萌 2019-06-25 17:21:04
如何正确确定当前脚本目录?我想看看在python中确定当前脚本目录的最佳方法是什么?我发现,由于调用python代码的方法很多,很难找到一个好的解决方案。以下是一些问题:__file__如果脚本是用exec, execfile__module__仅在模块中定义。用例:./myfile.pypython myfile.py./somedir/myfile.pypython somedir/myfile.pyexecfile('myfile.py')(来自另一个脚本,该脚本可以位于另一个目录中,并且可以具有另一个当前目录)。我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法。最常用的方法是os.path.dirname(os.path.abspath(__file__))但是,如果您从另一个exec().警告任何使用当前目录的解决方案都将失败,这可能根据脚本的调用方式而有所不同,或者在运行的脚本中进行更改。
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

os.path.dirname(os.path.abspath(__file__))

确实是你能得到的最好的。

使用exec/execfile通常,您应该使用模块基础结构来加载脚本。如果必须使用这些方法,我建议设置__file__globals您将传递给脚本,以便它能够读取该文件名。

在执行代码中没有获得文件名的其他方法:正如您注意到的,CWD可能位于一个完全不同的位置


查看完整回答
反对 回复 2019-06-25
?
翻阅古今

TA贡献1780条经验 获得超5个赞

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

filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))


查看完整回答
反对 回复 2019-06-25
?
慕沐林林

TA贡献2016条经验 获得超9个赞

#!/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消除符号链接)。它在交互式解释器中工作;在本例中,它返回当前的工作目录。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 680 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信