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