Почему 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; выполнение вышеизложенного должно исправить это. Надеюсь.