Difference between __file__ and sys.argv[0]
以下两者有什么区别吗?
__file__。
和
江户十一〔一〕号
因为两人似乎都在做同样的事情:他们持有脚本的名称。
如果没有区别,那么为什么在几乎所有的地方都使用__file__,而我从未见过sys.argv[0]被使用。
__file__是当前文件的名称,如果您在模块中,或者如果您使用execfile()而不是通过调用python scriptname.py来启动脚本,则可能与主脚本不同。__file__通常是你比较安全的赌注。
- 这就解释了。
- 如果脚本是使用-m开关执行的,那么sys.argv[0]甚至可以是模块名而不是文件名;如果使用捆绑执行,则可以是目录或zipfile名。
- 文件不应该是私有的,因此不能直接查询吗?
- @蒂亚戈不,可以直接进入。请参见stackoverflow.com/a/8689983/279627。
只有当您在Python程序的"主"脚本中时,情况才是一样的。如果导入其他文件,__file__将包含该文件的路径,但sys.argv仍将保留相同的值。
就像斯文说的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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__被文件名替换了。在Python中,我不确定100%的情况,但它是C/C++和Perl。在python中,这可能有所不同,因为__file__对于编译后的python文件(pyc也是正确的,而且该文件的内容中似乎没有文件名的任何痕迹。
- 路德维格:也许你应该做更多的实验。创建一个名为empty.py的空文件。在python交互提示下,输入以下行:import empty; print(empty.__file__); reload(empty); print(empty.__file__)…然后编辑你的答案。
- 我想你是对的-我已经更新了我的答案。谢谢。
- 路德维格:事实:__file__是模块的一个属性,在加载模块时自动创建。cpython没有预处理器步骤。
实际上,argv[0]可能是脚本名或脚本+脚本名的完整路径,具体取决于操作系统。
以下是官方文档中的条目http://docs.python.org/py3k/library/sys.html sys.argv