Как спроектировать интерфейс командной строки (CLI), который принимает функции или код Python? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть функция, которая анализирует данную строку с определенными правилами.Я хотел бы разработать интерфейс CLI для этой функции.Но проблема в том, что я хочу, чтобы пользователь мог вызывать эту функцию через CLI, используя собственную функцию READER & WRITER.Чтобы прояснить ситуацию, вот пример кода и демонстрация того, что я пытаюсь объяснить.

# mylib.py
# piece of code that belongs to my lib
def parser(_id, text):
    # parse the text & do some magic
    return (_id, parsed_text)
# user-side code
def reader():
   # read from a database
   # or file or network or who knows where
   yield (_id, text)
# user-side code
def writer(_id, text):
   # write to somewhere
   return True # or false depends on write action

Пример вызова должен быть примерно таким:

$ python mylib.py --reader <something-that-I-dont-know>

Я не хочу использовать eval трюки, но я также хочу, чтобы пользователь был гибким при передаче данных в мою библиотеку.Возможно ли это?Или я должен попробовать другой подход?

1 Ответ

0 голосов
/ 30 декабря 2018

С помощью @AlexHall я нашел следующее решение:

import pathlib
import importlib.util


def load_module(filepath):
    module_path = pathlib.Path(filepath)
    abs_path = module_path.resolve()
    module_name = module_path.stem

    spec = importlib.util.spec_from_file_location(module_name, abs_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

Используя эту функцию, я могу импортировать любой допустимый модуль python, существующий в файловой системе, даже еслиМодуль не в пути.

Вот пример использования:

parser = make_parser(prog="tokenizer")
args = parser.parse_args()
module = load_module(args.writer) # if nothing is passed, default action defined in the parser
writer = module.writer
module = load_module(args.reader)
reader = module.reader
# do what you want to do with them
...