Как определить, импортируется ли python script в качестве модуля или выполняется как script?
Вопрос довольно прост, но не найден в результате поиска. Как определить в python script, импортируется ли этот script в качестве модуля или выполняется как script? Есть ли вообще разница в python?
Проблема заключается в том, что я хочу оценить параметры командной строки только при запуске как script, но не в том случае, если модуль импортируется только для использования в другом script. (Я хочу использовать один script как библиотеку, так и программу.) Я боюсь, что ванильным способом будет сбор lib и второй script, который его использует, но я хотел бы иметь вторую вариант для небольшого инструмента/libs.
Ответы
Ответ 1
из python docs:
При запуске модуля Python с
python fibo.py
код в модуле будет выполненный, как если бы вы его импортировали, но с __name__
, установленным в "__main__"
. Это означает, что добавив этот код в конце вашего модуля:
if __name__ == '__main__':
# Running as a script
вы можете сделать файл полезным как script, а также импортируемый модуль, потому что код, который анализирует командную строку, запускается только в том случае, если модуль выполняется как "основной" файл
Ответ 2
Как отмечает @bobince:
Вы также будете __main__
, если вы являетесь модулем, вызванным python -m somemodule
Предположим, у вас есть файл Python bar.py
и пустой __init__.py
, оба в папке с именем foo
:
$ tree
.
└── foo
├── __init__.py
└── bar.py
$ cat foo/__init__.py
Приведенные ниже блоки кода Python являются содержимым foo/bar.py
.
Использование __name__
(не работает)
print('Code executed as a %s' % 'script' if __name__ == '__main__' else 'module')
Это даст:
$ python foo/bar.py
Code executed as a script
$ python -m foo.bar
Code executed as a script
import sys
mod_name = vars(sys.modules[__name__])['__package__']
print('Code executed as a ' + ('module named %s' % mod_name if mod_name else 'script'))
Это даст:
$ python foo/bar.py
Code executed as a module named foo
$ python -m foo.bar
Code executed as a script
Решение 2. Использование блока try-exc при импорте модуля
import sys
try:
import foo
print('Code executed as a module')
except ImportError:
print('Code executed as a script')
# Code will fail here, but you can still print a comprehensive error message before exiting:
print('Usage: python -m foo.bar')
sys.exit()
Это даст:
$ python foo/bar.py
Code executed as a module
$ python -m foo.bar
Code executed as a script
Usage: python -m foo.bar