簡體   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