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

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

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

这里有一些问题:

  • 如果脚本使用execexecfile执行,则__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消除了符号链接)。 它在交互式解释器中工作。 它在这种情况下返回当前的工作目录。

    链接地址: http://www.djcxy.com/p/9281.html

    上一篇: How to properly determine current script directory?

    下一篇: Properly handling IOError thrown by logging.config.fileConfig?