Как выбрать импортированный файл Python по аргументу командной строки пользователя - PullRequest
1 голос
/ 05 июля 2019

В главном файле python я импортирую другие файлы python, скажем, их имена - file1, file2, file3, и у всех них есть функция внутри них с именем scrap(). Я пытаюсь выбрать, какой файл scrap() будет работать в соответствии с пользовательским вводом, например:

python main.py file1

Вот соответствующая часть моего кода:

import file1
import file2
import file3

fileName = sys.argv[1]

for func in ['%s.scrap' % fileName]:
    meta, infos = func()

Однако я получаю это сообщение об ошибке:

Traceback (most recent call last):
File "main.py", line 50, in <module>
meta, infos = func()
TypeError: 'str' object is not callable

Обратите внимание, что это работает, когда я использую for func in [file1.scrap]: Я просто не могу использовать пользовательский ввод в качестве имени импортируемого файла. Может кто-нибудь сказать мне, как это сделать?

1 Ответ

0 голосов
/ 05 июля 2019

Вы пытаетесь вызвать func как функцию, когда это действительно строка, которую вы построили из аргумента командной строки.

Для ваших целей, как также упоминалось в связанном посте prashant, вы можете использовать что-то вроде модуля imp .

Вот краткий пример

import sys
import imp

# `imp.load_source` requires the full path to the module
# This will load the module provided as `user_selection`
# You can then either `import user_selection`, or use the `mod` to access the package internals directly
mod = imp.load_source("user_selection", "/<mypath>/site-packages/pytz/__init__.py")


# I'm using `user_selection` and `mod` instead of `pytz`
import user_selection
print(user_selection.all_timezones)

print(mod.all_timezones)

В вашем случае вам, возможно, придется использовать imp.find_module, чтобы получить полный путь только из имени, или указать полный путь непосредственно в командной строке.

Это должно быть отправной точкой

import sys
import imp

file_name = sys.argv[1]

f, filename, desc = imp.find_module(file_name, ['/path/where/modules/live'])
mod = imp.load_module("selected_module", f, filename, desc)

mod.scrap()
...