[英]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.