为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人8056858 2021-09-28 21:12:01
我有一个函数可以解析具有特定规则的给定字符串。我想为此功能设计一个 CLI 界面。但问题是我希望用户应该能够使用它自己的 READER & WRITER 函数通过 CLI 调用这个函数。为了清楚起见,这里有一个示例代码和我要解释的内容的演示。# mylib.py# piece of code that belongs to my libdef parser(_id, text):    # parse the text & do some magic    return (_id, parsed_text)# user-side codedef reader():   # read from a database   # or file or network or who knows where   yield (_id, text)# user-side codedef 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 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

在@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


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信