2017-02-06 5 views
4

вопрос о __init__.py в python 3.5.2. Я заметил, что «sys.argv» и «import __main__» ведут себя по-разному в зависимости от того, когда их вызывали. Например:поведение sys.argv с python -m

$ tree 
└── subdir 
    ├── __init__.py : "import sys; print(sys.argv)" 
    ├── __main__.py : "import sys; print(sys.argv)" 

$ python -m subdir 
['-m'] 
['/path/to/code/subdir/__main__.py'] 

Здесь я застигнут врасплох, как я ожидал sys.argv быть тем же самым в течение всей жизни процессов. У меня есть интуиция относительно того, почему это происходит, но мне интересно, есть ли способ узнать время импорта, что истинный sys.argv находится в модуле __init__.py.

Для справки, похоже, ARGV изменяется в Lib/[email protected]_run_module_as_main

+0

https://docs.python.org/3/using/cmdline.html#cmdoption-m описывает именно это. –

+0

@JoshLee хороший вызов, «первый элемент sys.argv будет полным путем к файлу модуля» показывает релевантность реализации sys.argv, но мне все еще интересно, как на время импорта в \ __ init__.py я могу вкратце разместить для sys.argv, возможно, не завершаться. – Buck

+0

@Buck Я думаю, что лучший способ * разместить * для этого не будет интересоваться 'sys.argv' в' __init __. Py'. Что вы делаете с ним в '__init__', чего вы не можете сделать в' __main__'? –

ответ

2

Short Version: нет никакого способа, чтобы найти __main__ до его запуска

Long Version:

  • флаг -m вызывает sys.argv [0] для управления
  • проблема заключается в сроках, с которыми манипулирует sys.argv
    • [email protected]_main делает некоторый флаг синтаксический и выскакивает от имени модуля для вызова
    • [email protected] оберткой [email protected]_run_module_as_main
    • _run_module_as_main устанавливает sys.argv [0], но делает не делать, пока после вызова [email protected]_get_main_module_details
      • побочный эффект в _get_module_details фактически импортирует пакет и его предков, который выполняет сценарий __init__.py перед тем _get_main_module_details может решить, таким образом, _run_module_as_main не может установить sys.argv

Я думаю, что это может быть переработан таким образом, что sys.argv установлен перед тем _get_module_details импортирует пакет и предков (я думаю, что стало возможным благодаря module specs), но придется ждать улучшения в архитектуре runpy, возможно, в форма this, которая была в работах по состоянию на конец прошлого года.