Как импортировать основную функцию из файла Python, не определяя в нем «def main»? - PullRequest
0 голосов
/ 11 мая 2018

Я пишу модуль Python (3.5), в котором я хотел бы использовать существующий модуль Python из проекта с открытым исходным кодом. Модуль, который я хочу импортировать, содержит:

  • несколько функций
  • a if __name__ == '__main__': инструкция

, но не содержит функции def main(args).

Поскольку нет действительной функции main, я не могу импортировать ее с помощью import module и использовать как module.main(). Хотя я нашел варианты для отдельного выполнения его в виде сценария с помощью команд os.system() и subprocess.Popen(), на самом деле я ищу способ сделать этот вызов неотъемлемой частью моего кода.

Я понимаю, что могу сам добавить часть def main() в исходный код, но, поскольку она исходит из проекта с открытым исходным кодом, я ищу способы оставить ее нетронутой, чтобы мне не нужно было поддерживать ее самостоятельно если он обновляется.

Я прошел через другие очень похожие вопросы, такие как это и это , которые не могли решить мою проблему. Этот ответ дает мне ощущение, что я пытаюсь сделать это не тривиально.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 11 мая 2018

Когда вы import модуль в первый раз (в отличие от импорта функции), весь код в этом модуле выполняется.Это означает, что функции становятся определенными, глобальные переменные становятся определенными и т. Д. Причина, по которой мы пишем блок if __name__ == "__main__":, заключается в том, что при импорте модуля этот код не выполняется (он будет выполняться только , если name == " main " ).Если вы просто удалите строку if __name__ == "__main__": и исправите отступ, этот код будет выполняться при импорте модуля.Возьмите этот модуль hello.py, например:

def hello_world():
    print("Hello world")
if __name__ == "__main__":
    hello_world()

, тогда, если мы импортируем:

import hello
hello_world()

Код ниже будет делать то же самое, что и в этом случае, когда первый модуль снова привет.py:

def hello_world():
    print("hello world")
hello_world()

модуль для запуска:

import hello

Я рекомендую вам не делать это таким образом, вам действительно нужно просто отредактировать, чтобы включить основную функцию.

...