如何设计一个接受 Python 函数或代码的命令行界面 (CLI)?

我有一个函数可以解析具有特定规则的给定字符串。我想为此功能设计一个 CLI 界面。但问题是我希望用户应该能够使用它自己的 READER & WRITER 函数通过 CLI 调用这个函数。为了清楚起见,这里有一个示例代码和我要解释的内容的演示。


# 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技巧,但我也希望用户在将数据传递到我的库时应该灵活。这可能吗?或者我应该尝试另一种方法?


慕码人8056858
浏览 229回答 1
1回答

一只萌萌小番薯

在@AlexHall 的帮助下,我想出了以下解决方案:import pathlibimport importlib.utildef load_module(filepath):&nbsp; &nbsp; module_path = pathlib.Path(filepath)&nbsp; &nbsp; abs_path = module_path.resolve()&nbsp; &nbsp; module_name = module_path.stem&nbsp; &nbsp; spec = importlib.util.spec_from_file_location(module_name, abs_path)&nbsp; &nbsp; module = importlib.util.module_from_spec(spec)&nbsp; &nbsp; spec.loader.exec_module(module)&nbsp; &nbsp; 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 parserwriter = module.writermodule = load_module(args.reader)reader = module.reader# do what you want to do with them
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python