Почему Python запускает мой модуль, когда я его импортирую, и как его остановить?
У меня есть программа Python, которую я создаю, которая может быть запущена любым из двух способов: Первый-вызвать "python main.py" который запрашивает пользователя для ввода в дружественной манере, а затем запускает пользовательский ввод через программу. Другой способ заключается в том, чтобы называть "питон batch.py - file - " который будет проходить через все дружественные сбора входных данных и запустить весь файл стоит ввода через программу в один раз.
проблема в том, что когда я бегу "batch.py" это импорт некоторые переменные / методы / etc из "main.py", и когда он запускает этот код:
import main
в первой строке программы, он сразу же ошибки, потому что он пытается запустить код в "main.py".
Как я могу остановить Python от запуска кода, содержащегося в" главном " модуле, который я импортирую?
9 ответов:
потому что именно так работает Python - ключевые слова, такие как
class
иdef
are не заявления. Вместо этого они реальные живые заявления, которые выполняются. Если бы они не были выполнены, ваш модуль был бы .. пусто : -)в любом случае, идиоматические подход:
# 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, однако.удачи в кодировании.
из-за того, как работает 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 функция; выполнение вышеизложенного должно исправить это. Я надеюсь.