繁体   English   中英

如何在 Python 中将 function、列表等作为 args 传递给 argparse?

[英]How to pass a function, list, among others as args to argparse in Python?

我有以下有效的脚本,我试图避免在同一个模块中使用'__main__'

def download():
    urls = \
        [
            'https://ipleak.net/json',
            'https://httpbin.org/get'
        ] * 4

    downloads = asyn.init_download(urls, "json")
    return downloads

def pprint_json(d):
    print(json.dumps(d, indent=4, sort_keys=True))

def multiprocess_list(n_pools, func, list):
    executor = concurrent.futures.ProcessPoolExecutor(n_pools)
    futures = [executor.submit(func, item) for item in list]
    concurrent.futures.wait(futures)

if __name__ == '__main__':
    multiprocess_list(4, pprint_json, download())

顾名思义, download() function 使用asyncioaiohttp异步下载urls

我想从“全局”的任何地方执行multiprocess_list

def multiprocess_list(n_pools, func, list):
    executor = concurrent.futures.ProcessPoolExecutor(n_pools)
    futures = [executor.submit(func, item) for item in list]
    concurrent.futures.wait(futures)

def main(args):
    parser = argparse.ArgumentParser(description="Multiprocessing a list.")
    parser.add_argument("-n", "--n_pools", type=int, required=True)
    parser.add_argument("-f", "--function", required=True)
    parser.add_argument("-l", "--list", required=True)
    args = parser.parse_args(args)

    multiprocess_list(args.n_pools, args.function, args.list)

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

将上述模块导入到任何其他 python 文件中,也许像这样运行它:(虽然不起作用)

def download():
    urls = \
        [
            'https://ipleak.net/json',
            'https://httpbin.org/get'
        ] * 4

    downloads = asyn.init_download(urls, "json")
    return downloads

def pprint_json(d):
    print(json.dumps(d, indent=4, sort_keys=True))

mp.main(["-n", 4, "-f", pprint_json, "-l", download()])

这给了我一个错误:

if not arg_string[0] in self.prefix_chars: TypeError: 'int' object is not subscriptable

因此,将一个参数作为要运行的 function 传递,另一个作为列表或 function 传递,它返回类似download()的列表。

  • 这可以在 python 中完成吗?
  • 如果是,有人可以解释一下吗?
  • 我的方法是正确的还是我完全失去了它?

注意:我的解释器使用 Python3.8,我对 python 有点陌生,请多多包涵。

Argparse 需要一个字符串列表,并且可能会阻塞其他类型。 如果您引用4 ,它是否有效?

mp.main(["-n", "4", "-f", pprint_json, "-l", download()])

pprint_jsondownload()的结果也应该是这个工作的字符串。

这种创建替代 argv 的方法并不总是很疯狂,但是在您的情况下,如果您已经拥有它们,为什么还要调用main()来为您解析 args? 为什么不用适当的 arguments 直接调用multiprocess_list()

使用main()的原因是因为我将来可能会添加除multiprocess_list()之外的更多功能

然后,您可以在从 Python 调用脚本时直接调用它们,而不是为其中一个 select 创建另一个参数。 您仍然可以使用main()从命令行解析参数。

下一个错误TypeError: 'function' object is not subscriptable

啊,那也不是字符串。 在那种情况下,我也不希望它在命令行中工作。 你有这么多工作吗?

你可以尝试类似的东西

mp.main(["-n", "4", "-f", "pprint_json", "-l", download()])

但是main()必须能够以某种方式将 function 名称解释为 function 。 也许像

multiprocess_list(args.n_pools, getattr(foo, args.function), args.list)

其中foo是您保留可选功能的模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM