在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(Snow Leopard)上,我遇到了
NameError: global name '__file__' is not defined
测试用例
目录结构
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
在Windows上运行python a.py
的输出结果
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
execfile
已经不存在了,而且我不清楚为什么测试用例中的代码应该返回任何不同的内容,或者通过让b.py
能够识别其自身源代码位置来解决什么问题。就此而言,代码可以从非文件来源运行。 - Karl Knechtel