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


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

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

import main

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

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

9 103

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__" для чего?

для этого требуется управление исходным кодом над модулем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 функция; выполнение вышеизложенного должно исправить это. Я надеюсь.