Вопрос-Ответ

Why is Python running my module when I import it, and how do I stop it?

Почему Python запускает мой модуль, когда я его импортирую, и как мне это остановить?

У меня есть программа на Python, которую я создаю, которую можно запустить любым из двух способов: первый - вызвать python main.py который запрашивает у пользователя ввод в удобной форме, а затем запускает пользовательский ввод через программу. Другой способ - вызвать python batch.py -file- который пропустит весь удобный сбор входных данных и пропустит весь входной файл через программу за один раз.

Проблема в том, что когда я запускаю batch.py, он импортирует некоторые переменные / методы / etc из main.py, и когда он запускает этот код:

import main

в первой строке программы сразу же появляется ошибка, потому что она пытается запустить код в main.py.

Как я могу запретить Python запускать код , содержащийся в main модуле, который я импортирую?

Переведено автоматически
Ответ 1

Потому что именно так работает Python - ключевые слова, такие как class и def , не являются объявлениями. Вместо этого выполняются настоящие действующие инструкции. Если бы они не выполнялись, ваш модуль был бы пустым.

Идиоматический подход заключается в:

# stuff to run always here such as class/def
def main():
pass

if __name__ == "__main__":
# stuff only to run when not called via 'import' here
main()

Однако для этого требуется контроль источника над импортируемым модулем.

Ответ 2

Из-за того, как работает Python, ему необходимо запускать ваши модули при их импорте.

Чтобы предотвратить выполнение кода в модуле при импорте, но только при непосредственном запуске, вы можете защитить его этимif:

if __name__ == "__main__":
# this won't be run when imported

Возможно, вы захотите поместить этот код в main() метод, чтобы вы могли либо выполнить файл напрямую, либо импортировать модуль и вызвать main(). Например, предположим, что это находится в файле foo.py.

def main():
print "Hello World"

if __name__ == "__main__":
main()

Эту программу можно запустить либо перейдя python foo.py, либо из другого скрипта Python:

import foo

...

foo.main()
Ответ 3

Используйте if __name__ == '__main__' идиому -- __name__ это специальная переменная, значение которой равно '__main__', если модуль запускается как скрипт, и имя модуля, если он импортирован. Итак, вы бы сделали что-то вроде

# imports
# class/function definitions
if __name__ == '__main__':
# code here will only run when you invoke 'python main.py'
Ответ 4

К сожалению, вы этого не делаете. Это часть того, как работает синтаксис импорта, и важно, чтобы он это делал - помните, def на самом деле что-то выполняется, если Python не выполнял импорт, вы бы, ну, застряли без функций.

Однако, поскольку у вас, вероятно, есть доступ к файлу, вы могли бы посмотреть, что вызывает ошибку. Возможно, можно изменить вашу среду, чтобы предотвратить возникновение ошибки.

2023-09-08 13:30 python