在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脚本所在目录
您不能直接确定正在执行的主脚本的位置。毕竟,有时候脚本根本就不是来自文件。例如,它可能来自交互式解释器或仅存储在内存中的动态生成的代码。
但是,您可以可靠地确定模块的位置,因为模块总是从文件中加载的。如果您使用以下代码创建了一个模块,并将其放在与主脚本相同的目录中,则主脚本可以导入该模块并使用它来定位自身。
some_path / module_locator.py:
def we_are_frozen():
# All of the modules are built-in to the interpreter, e.g., by py2exe
return hasattr(sys, "frozen")
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(unicode(__file__, encoding))
some_path / main.py:
import module_locator
my_path = module_locator.module_path()
如果在不同的目录中有几个主脚本,则可能需要module_locator的多个副本。
当然,如果您的主脚本是由其他工具加载的,而这些工具不允许您导入与脚本共存的模块,那么您就不走运了。在这种情况下,您要查找的信息在您的程序中根本不存在。最好的办法是向工具的作者提交一个错误。
您不能直接确定正在执行的主脚本的位置。毕竟,有时候脚本根本就不是来自文件。例如,它可能来自交互式解释器或仅存储在内存中的动态生成的代码。
但是,您可以可靠地确定模块的位置,因为模块总是从文件中加载的。如果您使用以下代码创建了一个模块,并将其放在与主脚本相同的目录中,则主脚本可以导入该模块并使用它来定位自身。
some_path / module_locator.py:
def we_are_frozen():
# All of the modules are built-in to the interpreter, e.g., by py2exe
return hasattr(sys, "frozen")
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(unicode(__file__, encoding))
some_path / main.py:
import module_locator
my_path = module_locator.module_path()
如果在不同的目录中有几个主脚本,则可能需要module_locator的多个副本。
当然,如果您的主脚本是由其他工具加载的,而这些工具不允许您导入与脚本共存的模块,那么您就不走运了。在这种情况下,您要查找的信息在您的程序中根本不存在。最好的办法是向工具的作者提交一个错误。