__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__)

[转]获取当前执行主脚本的方法

[py]python __file__ 与argv[0]

字符串和列表

如何用python批量修改文件创建时间