__file__ 和 sys.argv[0] 之间的区别
Posted
技术标签:
【中文标题】__file__ 和 sys.argv[0] 之间的区别【英文标题】:Difference between __file__ and sys.argv[0] 【发布时间】:2011-08-16 15:11:47 【问题描述】:两者有什么区别:
__file__
和
sys.argv[0]
因为两者似乎都在做同样的事情:它们拥有脚本的名称。
如果没有区别,那为什么几乎所有地方都使用__file__
,而我从未见过sys.argv[0]
被使用。
【问题讨论】:
【参考方案1】:__file__
是当前文件的名称,如果您在模块内或者使用execfile()
而不是调用python scriptname.py
启动脚本,则它可能与主脚本不同。 __file__
通常是您更安全的选择。
【讨论】:
sys.argv[0] 如果您的脚本是使用-m
开关执行的,甚至可能是模块名称而不是文件名,或者如果您使用捆绑执行,则可能是目录或 zip 文件名称。
难道 _file_ 不应该是私有的,因此不能直接查询吗?
@Tiago 不,直接访问就可以了。参见例如***.com/a/8689983/279627.【参考方案2】:
只有当你在你的 python 程序的“主”脚本中时它是一样的。如果您导入其他文件,__file__
将包含该文件的路径,但 sys.argv 仍将保留相同的值。
【讨论】:
【参考方案3】:就像斯文所说的那样。
MiLu@Dago: /tmp > cat file.py
import sys
import blub
print __file__
print sys.argv[0]
MiLu@Dago: /tmp > cat blub.py
import sys
print "BLUB: " + __file__
print "BLUB: " + sys.argv[0]
MiLu@Dago: /tmp > python file.py
BLUB: /tmp/blub.pyc
BLUB: file.py
file.py
file.py
我认为__file__
在预处理步骤中被替换为文件名。我不是 100% 确定 Python 中的情况确实如此——但它在 C/C++ 和 Perl 中。在 Python 中,这可能会有所不同,因为 __file__
也适用于已编译的 Python 文件 (pyc
),并且在该文件的内容中似乎没有任何文件名的痕迹。
【讨论】:
Ludwig:也许你应该做更多的实验。创建一个名为empty.py
的空文件。在 Python 交互式提示符下,输入以下行:import empty; print(empty.__file__); reload(empty); print(empty.__file__)
... 然后编辑您的答案。
Ludwig:事实:__file__
是模块的一个属性,在加载模块时自动创建。 CPython 没有预处理器步骤。【参考方案4】:
实际上 argv[0] 可能是脚本名称或脚本的完整路径 + 脚本名称,具体取决于操作系统。
这是官方文档中的条目http://docs.python.org/py3k/library/sys.html#sys.argv
【讨论】:
以上是关于__file__ 和 sys.argv[0] 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
python程序运行路径和当前文件路径?os.getcwd()os.path.abspath(__file__)sys.path[0]sys.argv[0]realpath(__file__)
python程序运行路径和当前文件路径?os.getcwd()os.path.abspath(__file__)sys.path[0]sys.argv[0]realpath(__file__)