Подтвердить что ты не робот

Как определить, импортируется ли python script в качестве модуля или выполняется как script?

Вопрос довольно прост, но не найден в результате поиска. Как определить в python script, импортируется ли этот script в качестве модуля или выполняется как script? Есть ли вообще разница в python?

Проблема заключается в том, что я хочу оценить параметры командной строки только при запуске как script, но не в том случае, если модуль импортируется только для использования в другом script. (Я хочу использовать один script как библиотеку, так и программу.) Я боюсь, что ванильным способом будет сбор lib и второй script, который его использует, но я хотел бы иметь вторую вариант для небольшого инструмента/libs.

4b9b3361

Ответ 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

Решение 1: использование vars() и sys.modules

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