簡體   English   中英

如何將 python argparse 與 sys.argv 以外的 args 一起使用?

[英]How to use python argparse with args other than sys.argv?

我已經瀏覽了所有文檔,似乎沒有辦法做到這一點,但是:

有沒有辦法將 argparse 與任何字符串列表一起使用,而不僅僅是與 sys.argv 一起使用?

這是我的問題:我有一個看起來像這樣的程序:

# This file is program1.py
import argparse

def main(argv):
    parser = argparse.ArgumentParser()
    # Do some argument parsing

if __name__ == '__main__':
    main(sys.argv)

當直接從命令行調用該程序時,這可以正常工作。 但是,我有另一個 python 腳本,它使用不同的命令行參數運行該腳本的批處理版本,我正在使用它:

import program1

arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)

我仍然希望能夠解析參數,但 argparse 自動默認使用 sys.argv 而不是我給它的參數。 有沒有辦法傳入參數列表而不是使用 sys.argv?

您可以將字符串列表傳遞給parse_args

parser.parse_args(['--foo', 'FOO'])

只需將腳本更改為默認為sys.argv[1:]並解析省略第一個參數(這是調用命令的名稱)

import argparse,sys

def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser()
    # Do some argument parsing
    args = parser.parse_args(argv)

if __name__ == '__main__':
    main()

或者,如果您不能省略第一個參數:

import argparse,sys

def main(args=None):
    # if None passed, uses sys.argv[1:], else use custom args
    parser = argparse.ArgumentParser()
    parser.add_argument("--level", type=int)
    args = parser.parse_args(args)

    # Do some argument parsing

if __name__ == '__main__':
    main()

上一篇:如果你不能改變被調用的程序,你仍然可以做一些事情

假設您無法更改的程序名為argtest.py (我添加了對打印參數的調用)

然后只需更改argtest.sys模塊的本地argv值:

import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()

輸出:

['dummy', 'foo', 'bar']    

Python argparse 現在有一個參數nargs用於add_argument ( https://docs.python/3/library/argparse.html )。

它允許我們為命名參數擁有任意數量的參數(這里是alist

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--alist", nargs="*")
args = parser.parse_args()

print(args.alist)

--alist所有命令行值都添加到列表中。

示例:

$ python3 argparse-01.py --alist fred barney pebbles "bamm bamm"
['fred', 'barney', 'pebbles', 'bamm bamm']

如您所見,允許引用參數,但除非您需要保護空格,否則不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM