Почему Python запускает мой модуль, когда я его импортирую, и как его остановить?
У меня есть программа Python, которую я создаю, которая может быть запущена одним из двух способов: первым является вызов "python main.py", который запрашивает пользователя для ввода дружественным образом, а затем запускает пользовательский ввод через программа. Другим способом является вызов "python batch.py -file-", который пройдет через все дружественные входные собрания и запустит весь файл, который будет вводиться через программу за один раз.
Проблема в том, что когда я запускаю "batch.py", он импортирует некоторые переменные/методы/etc из "main.py" и когда он запускает этот код:
import main
в первой строке программы, он сразу же ошибочно, потому что он пытается запустить код в "main.py".
Как я могу остановить Python от запуска кода, содержащегося в основном "модуле", который я импортирую?
Ответы
Ответ 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()
См. Что такое if __name__ == "__main__"
для?
Однако для этого требуется, чтобы модуль управления источником был import
ed.
Счастливое кодирование.
Ответ 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 script:
import foo
...
foo.main()
Ответ 3
Использовать if __name__ == '__main__'
idiom - __name__
- специальная переменная, значение которой '__main__'
, если модуль запускается как script, и имя модуля, если оно импортировано. Итак, вы бы сделали что-то вроде
# imports
# class/function definitions
if __name__ == '__main__':
# code here will only run when you invoke 'python main.py'
Ответ 4
К сожалению, нет. Это часть того, как работает синтаксис импорта, и важно, чтобы он это сделал. Помните, что def
на самом деле что-то выполнено, если Python не выполнил импорт, вы, должно быть, застряли без функций.
Так как вы, вероятно, имеете доступ к файлу, вы можете посмотреть и узнать, что вызывает ошибку. Возможно, вы сможете изменить среду, чтобы предотвратить возникновение ошибки.
Ответ 5
Поместите код в функцию, и он не запустится, пока вы не вызовете функцию. У вас должна быть основная функция в вашем main.py
с утверждением:
if __name__ == '__main__':
main()
Затем, если вы python main.py
будет запущена функция main()
. Если вы импортируете main.py
, он не будет. Также, для ясности, вам, вероятно, следует переименовать main.py
в другое.
Ответ 6
Вы можете написать свой "main.py" следующим образом:
#!/usr/bin/env python
__all__=["somevar", "do_something"]
somevar=""
def do_something():
pass #blahblah
if __name__=="__main__":
do_something()
Ответ 7
Было предложение по улучшению Python PEP 299, целью которого было заменить if __name__ == '__main__':
idiom на def __main__:
, но он был отклонен. По-прежнему хорошо читать, чтобы знать, что следует учитывать при использовании if __name__ = '__main__':
.
Ответ 8
Хотя вы не можете использовать import
без запуска кода; существует довольно быстрый способ ввода переменных; используя numpy.savez
, который хранит переменные как массивы numpy в файле .npz. Затем вы можете загрузить переменные с помощью numpy.load
.
См. полное описание в скудной документации
Обратите внимание, что это относится только к переменным и массивам переменной, а не к методам и т.д.
Ответ 9
Попробуйте просто импортировать функции, необходимые из main.py? Таким образом,
from main import SomeFunction
Возможно, вы назвали функцию в batch.py той же, что и в main.py, а при импорте main.py программа запускает функцию main.py вместо функции batch.py; выполнение вышеизложенного должно исправить это. Надеюсь.