Разница между __file__ и sys.argv [0] - PullRequest
23 голосов
/ 02 мая 2011

Есть ли разница между:

__file__

и

sys.argv[0]

Потому что оба, кажется, делают одно и то же: они содержат имя сценария.

Если нет никакой разницы, то почему __file__ используется почти во всех местах, тогда как я никогда не видел, чтобы sys.argv[0] использовался.

Ответы [ 4 ]

20 голосов
/ 02 мая 2011

__file__ - имя текущего файла, которое может отличаться от основного сценария, если вы находитесь внутри модуля или запускаете сценарий, используя execfile(), а не вызывая python scriptname.py. __file__ - обычно ваша более безопасная ставка.

4 голосов
/ 02 мая 2011

Это то же самое, если вы находитесь в «основном» скрипте вашей программы на Python. Если вы импортируете другие файлы, __file__ будет содержать путь к этому файлу, но sys.argv будет по-прежнему содержать те же значения.

2 голосов
/ 02 мая 2011

Это как сказал Свен.

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), и, похоже, в содержимом этого файла нет никаких следов имени файла.

0 голосов
/ 02 мая 2011

На самом деле argv [0] может быть именем скрипта или полным путем к скрипту + имя скрипта, в зависимости от операционной системы.

Вот запись в официальной документации http://docs.python.org/py3k/library/sys.html#sys.argv

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...