Разница между __file__ и sys.argv [0]
Есть ли разница между:
__file__
и
sys.argv[0]
Потому что оба, похоже, делают одно и то же: они хранят имя script.
Если нет никакой разницы, то почему это то, что __file__
используется почти во всех некоторых местах, тогда как я никогда не видел sys.argv[0]
.
Ответы
Ответ 1
__file__
- это имя текущего файла, который может отличаться от основного script, если вы находитесь внутри модуля, или если вы запускаете script с помощью execfile()
, а не вызываете python scriptname.py
. __file__
- это, как правило, более безопасная ставка.
Ответ 2
Это все равно, если вы находитесь в "главном" script вашей программе python. Если вы импортируете другие файлы, __file__
будет содержать путь к этому файлу, но sys.argv все равно сохранит те же значения.
Ответ 3
Это похоже на Свена.
[email protected]: /tmp > cat file.py
import sys
import blub
print __file__
print sys.argv[0]
[email protected]: /tmp > cat blub.py
import sys
print "BLUB: " + __file__
print "BLUB: " + sys.argv[0]
[email protected]: /tmp > python file.py
BLUB: /tmp/blub.pyc
BLUB: file.py
file.py
file.py
Я думал, что __file__
был заменен именем файла во время этапа препроцессора. Я не был на 100% уверен, что на самом деле дело в Python, но оно находится в C/С++ и Perl. В Python это может быть другим, поскольку __file__
также корректен для скомпилированных файлов Python (pyc
), и в этом содержимом файла не должно быть следа имени файла.
Ответ 4
Фактически argv [0] может быть именем script или полным путем к имени script + script, в зависимости от os.
Здесь запись в официальной документации http://docs.python.org/py3k/library/sys.html#sys.argv