如何解决如何在 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))
一些路径/main.py:
import module_locator
my_path = module_locator.module_path()
如果您在不同目录中有多个主脚本,则可能需要多个 module_locator 副本。
当然,如果您的主脚本是由其他一些工具加载的,而这些工具不允许您导入与您的脚本位于同一位置的模块,那么您就不走运了。在这种情况下,您所追求的信息根本不存在于您的程序中的任何地方。您最好的选择是向该工具的作者提交错误。
解决方法
这似乎是一个新手问题,但事实并非如此。一些常见的方法并不适用于所有情况:
sys.argv[0]
这意味着使用path = os.path.abspath(os.path.dirname(sys.argv[0]))
,但是如果您从另一个目录中的另一个
Python 脚本运行,这将不起作用,这可能在现实生活中发生。
文件
这意味着使用path = os.path.abspath(os.path.dirname(__file__))
,但我发现这不起作用:
py2exe
没有__file__
属性,但有一个解决方法- 当您从没有属性的IDLE运行时
execute()``__file__
- Mac OS X v10.6 (Snow Leopard) 我从哪里得到
NameError: global name '__file__' is not defined
我正在寻找一种 通用解决方案 ,一种适用于上述所有用例的解决方案。
更新
这是一个测试用例的结果:
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
一个.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")
文件 子目录/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
树
C:.
| a.py
\---subdir
b.py
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。