发布于2019-08-21 20:43 阅读(762) 评论(0) 点赞(9) 收藏(4)
这似乎是一个新手问题,但事实并非如此。一些常见的方法并不适用于所有情况:
这意味着使用path = os.path.abspath(os.path.dirname(sys.argv[0]))
,但如果您从另一个目录中的另一个Python脚本运行,这不起作用,这可能发生在现实生活中。
这意味着使用path = os.path.abspath(os.path.dirname(__file__))
,但我发现这不起作用:
py2exe
没有__file__
属性,但有一个解决方法execute()
没有__file__
属性NameError: global name '__file__' is not defined
回答不完整的相关问题:
我正在寻找一个通用的解决方案,一个适用于所有上述用例的解决方案。
这是测试用例的结果:
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
#! /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")
#! /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
您无法直接确定正在执行的主脚本的位置。毕竟,有时脚本根本不是来自文件。例如,它可以来自交互式解释器或仅存储在存储器中的动态生成的代码。
但是,您可以可靠地确定模块的位置,因为模块始终从文件加载。如果使用以下代码创建模块并将其放在与主脚本相同的目录中,则主脚本可以导入模块并使用它来定位自身。
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副本。
当然,如果您的主脚本是由某些其他工具加载的,这些工具不允许您导入与您的脚本位于同一位置的模块,那么您就不走运了。在这种情况下,您所追求的信息根本不存在于您的程序中的任何位置。您最好的选择是向该工具的作者提交一个错误。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/51173/bdf039b7a77d9060ee32/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!