Разница между __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