首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确确定当前脚本目录?

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

Stack Overflow用户
提问于 2010-09-15 22:34:57
回答 16查看 146.9K关注 0票数 331

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

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

以下是一些问题:

如果使用模块执行脚本,则不定义

  • __file__;如果仅在execfile
  • __module__

中定义模块,则不定义exec

使用案例:

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

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

最常用的方法是os.path.dirname(os.path.abspath(__file__)),但是如果您使用exec()从另一个脚本执行脚本,那么这种方法就不起作用了。

警告

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

EN

回答 16

Stack Overflow用户

发布于 2010-09-15 23:01:21

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

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

使用exec/execfile执行脚本并不常见;通常情况下,您应该使用模块基础设施来加载脚本。如果必须使用这些方法,我建议在传递给脚本的globals中设置__file__,以便脚本可以读取该文件名。

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

票数 282
EN

Stack Overflow用户

发布于 2011-06-02 10:49:46

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

filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
票数 145
EN

Stack Overflow用户

发布于 2014-04-05 22:01:08

#!/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__ -based解决方案在这里将失败)。如果脚本在an executable zip file (/an egg)中,它就会起作用。如果脚本是从压缩文件“导入”(PYTHONPATH=/path/to/library.zip python -mscript_to_run)的,那么它就可以工作;在本例中,它返回归档路径。如果脚本被编译成独立的可执行文件(sys.frozen),它就会起作用。它适用于符号链接(realpath消除了符号链接)。它在交互式解释器中工作;在本例中,它返回当前的工作目录。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3718657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档