2011-05-01 2 views
15

Есть ли разница между:разница между __FILE__ и sys.argv [0]

__file__

и

sys.argv[0]

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

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

ответ

11

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

+0

Это объясняет это. – user225312

+1

sys.argv [0] может даже быть именем модуля, а не именем файла, если ваш скрипт был запущен с помощью ключа '-m', или имя каталога или zipfile, если вы используете входящее в комплект исполнение. – ncoghlan

+0

Не \ __ файл \ __ должен быть закрытым и, следовательно, не запрашиваться напрямую? – Tiago

4

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

0

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

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

2

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

[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/C++ и Perl. В Python это может быть другим, поскольку __file__ также подходит для скомпилированных файлов Python (pyc), и, похоже, нет ни одного следа имени файла в содержимом этого файла.

+0

Людвиг: Наверное, вам следует провести еще несколько экспериментов. Создайте пустой файл с именем 'empty.py'. В интерактивном приглашении Python введите следующую строку: 'import empty; печать (пустой .__ FILE__); Reload (пусто); print (пустой .__ файл __) '... затем отредактируйте свой ответ. –

+0

Угадайте, что вы правы - я обновил свой ответ. Благодарю. – Lumi

+0

Ludwig: Факты: '__file__' - это атрибут модуля, созданный автоматически при загрузке модуля. CPython не имеет препроцессора. –

Смежные вопросы