在Python中是否有通用的方法来找出当前正在执行的文件的路径?
失败的方法
Path = os.path.abspath(os.path.dirname(sys.argv[0]))
如果您正在从另一个目录中的另一个Python脚本运行,例如在2.x中使用execfile,则这将不起作用。
Path = os.path.abspath(os.path.dirname(__file__))
我发现这在以下情况下不起作用:
Py2exe没有__file__属性,尽管有一个变通方法
当使用execute()从IDLE运行代码时,在这种情况下没有__file__属性
在Mac OS X v10.6(雪豹)上,我得到NameError:未定义全局名称“__file__”
测试用例
目录树
C:.
| a.py
\---subdir
b.py
a.py的内容
#! /usr/bin/env python
import os, sys
print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print
execfile("subdir/b.py")
subdir/b.py的内容
#! /usr/bin/env python
import os, sys
print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print
python a.py的输出(在Windows上)
a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz
b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz
相关的(但这些答案是不完整的)
查找当前运行文件的路径
当前文件的路径取决于我如何执行程序
如何知道Python中运行脚本的路径?
将directory更改为Python脚本所在目录
有关相关信息,请参阅我对从父文件夹导入模块问题的回答,包括为什么我的回答不使用不可靠的__file__变量。这个简单的解决方案应该与不同的操作系统交叉兼容,因为os和inspect模块是Python的一部分。
首先,您需要导入inspect和os模块的部分内容。
from inspect import getsourcefile
from os.path import abspath
接下来,在Python代码中其他需要它的地方使用下面这行代码:
abspath(getsourcefile(lambda:0))
工作原理:
从内置模块os(下面介绍)导入abspath工具。
Mac, NT或Posix的操作系统例程,这取决于我们使用的是什么系统。
然后从内置模块inspect导入getsourcefile(下面的描述)。
从活动的Python对象中获取有用的信息。
Abspath (path)返回文件路径的绝对/完整版本
getsourcefile(lambda:0)以某种方式获取lambda函数对象的内部源文件,因此在Python shell中返回'<pyshell#nn>'或返回当前正在执行的Python代码的文件路径。
对getsourcefile(lambda:0)的结果使用abspath应该确保生成的文件路径是Python文件的完整文件路径。
这个解释的解决方案最初是基于回答“如何在Python中获取当前执行文件的路径?”的代码。
有关相关信息,请参阅我对从父文件夹导入模块问题的回答,包括为什么我的回答不使用不可靠的__file__变量。这个简单的解决方案应该与不同的操作系统交叉兼容,因为os和inspect模块是Python的一部分。
首先,您需要导入inspect和os模块的部分内容。
from inspect import getsourcefile
from os.path import abspath
接下来,在Python代码中其他需要它的地方使用下面这行代码:
abspath(getsourcefile(lambda:0))
工作原理:
从内置模块os(下面介绍)导入abspath工具。
Mac, NT或Posix的操作系统例程,这取决于我们使用的是什么系统。
然后从内置模块inspect导入getsourcefile(下面的描述)。
从活动的Python对象中获取有用的信息。
Abspath (path)返回文件路径的绝对/完整版本
getsourcefile(lambda:0)以某种方式获取lambda函数对象的内部源文件,因此在Python shell中返回'<pyshell#nn>'或返回当前正在执行的Python代码的文件路径。
对getsourcefile(lambda:0)的结果使用abspath应该确保生成的文件路径是Python文件的完整文件路径。
这个解释的解决方案最初是基于回答“如何在Python中获取当前执行文件的路径?”的代码。