[英]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 使用asyncio
和aiohttp
异步下载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()
的列表。
注意:我的解释器使用 Python3.8,我对 python 有点陌生,请多多包涵。
Argparse 需要一个字符串列表,并且可能会阻塞其他类型。 如果您引用4
,它是否有效?
mp.main(["-n", "4", "-f", pprint_json, "-l", download()])
pprint_json
和download()
的结果也应该是这个工作的字符串。
这种创建替代 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.