Python Importlib loader.exec_module для запуска функции файла py - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть несколько .py файлов в нескольких папках. Я делаю os.walk и получаю все имена файлов .py в списке файлов, и до этого я знаю, что каждый .py содержит функцию test(), которая принимает целое число и возвращает целое число (которое несколько уникально). Я использую следующий код. Где r - целое число, файлы содержат путь к py-файлу, например:

C://users//codebase//user1//int_user_1.py

for fil in files:
    spec = importlib.util.spec_from_file_location("test", fil)
    foo = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(foo)
    get_test = foo.test(r)

Но проблема в том, что строка spec.loader.exec_module(foo) выполняет все код в файле fil из строки 1 этого конкретного файла .py, а не только функция fil.test(). Как я могу выполнить только функцию fil.test()?

EDIT-1: я не могу внести какие-либо изменения в содержимое fil.py.

1 Ответ

0 голосов
/ 11 февраля 2020

Как я могу выполнить только функцию fil.test ()?

Обернуть весь код без объявления в условии if __name__ == '__main__'.

Python Модули - это исполняемый код, загрузка модуля означает выполнение тела модуля в специальном «пространстве имен модуля». Если есть код, который вы не хотите выполнять при импорте, вы должны «поставить его», используя условие выше: __name__ модуля имеет значение "__main__", только если модуль выполняется непосредственно, например

$ echo "print(__name__)" > foo.py
$ python foo.py
__main__
$ python -c 'import foo'
foo
...