Как выполнить код в `if __name__ ==" __main __ "` из другого файла python - PullRequest
0 голосов
/ 27 марта 2019

В моем файле python у меня есть функция, которая принимает некоторые параметры, и в том же файле у меня есть предложение if __name__ == "__main__", которое запускает эту функцию с определенным набором параметров (для пользователя, чтобы продемонстрировать, что он делает).Например,

def foo(arg1, arg2):
    pass

if __name__ == "__main__":
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

Кроме того, у меня есть еще один файл с тестами, который используется pytest.Я бы хотел, чтобы один из тестовых прогонов выполнялся в точности так, как написано в вышеупомянутом условии if, т.е. выполняется

arg1 = 1
arg2 = 2
foo(arg1, arg2)

Возможно ли это без копирования кода в файл, содержащий тесты?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Если у вас есть файлы

file1.py

def foo(arg1, arg2):
    pass

if __name__ == "__main__":
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

и file2.py находятся в том же каталоге, в котором вы можете:

file2.py

from file1 import foo
arg1 = 1
arg2 = 2
foo(arg1, arg2)

Вам нужно будет переопределить arg1 и arg2, как у вас, но тогда нужно просто импортировать нужную вам функцию. Это даст вам функцию, но не глобальные переменные file1.py, потому что они защищены оператором if __name__ == "__main__"

UPDATE

Если вы не хотите переназначать в file2.py, вы можете сделать что-то вроде этого:

file1.py

def foo(arg1, arg2):
    pass

def new_function(): #make a new function that you can import
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

if __name__ == "__main__":
    new_function()

file2.py

from file1 import new_function
new_function()

Это не самое худшее, потому что вы по-прежнему храните arg1 и arg2 в качестве локальных переменных, поэтому нет большой проблемы с пространством имен, но теперь вы можете импортировать их, поскольку они не защищены в разделе if name == main ваш код.

0 голосов
/ 27 марта 2019

Ну, я не эксперт в этом, но как насчет перенаправления if __name__ == "__main__": в другую функцию и вызова этой функции из другого файла?

file1:

def main_file1:
  arg1 = 1
  arg2 = 2
  foo(arg1, arg2)

if __name__ == "__main__":
  main_file1()

file2:

from file1 import *

def somefunc():
  main_file1()

Однако я не уверен, почему вы все равно захотите это сделать.Обычно у вас есть только одна основная функция во всем вашем проекте, чтобы запускать и вызывать другие функции оттуда.

И, в конечном итоге, этот вид не справляется с задачей главной функции файла

...