在argparse参数中添加其他参数

时间:2013-11-25 19:41:46

标签: python argparse

我是新手在python中使用arparse模块,我希望有人可以帮助我解决以下问题。 我使用以下命令将可变数量的文件指定为输入:

parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+') 
args = parser.parse_args()

我想指定一个可变数量的文件输入,每个输入的关联值为1或2,我不知道如何执行此操作。

我希望程序能够运行,以便我的命令行输入为:

MyProgram.py -i myfile.txt 2 secondfile.txt 1 ...

一旦我有这个工作,我如何调用程序中的每个文件?

4 个答案:

答案 0 :(得分:1)

您的代码正常运行。您可以使用grouper recipe一次循环args.input两个项目:

import argparse
parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+') 
args = parser.parse_args()
for filename, num in zip(*[iter(args.input)]*2):
    print(filename, num)
    # with open(filename) as f:
    #     ....

产量

('myfile.txt', '2')
('secondfile.txt', '1')

答案 1 :(得分:1)

对于每对输入,-i一次会更清楚,如下所示:

parser.add_argument("-i", "--input", nargs=2, action='append')

现在,args.input将是一个列表列表,如此

 [ ['myfile.txt', 2], ['secondfile.txt', 1] ]

它确实需要为用户输入更多内容,因为-i需要为每个文件显式输入一次。

另一种选择是将每个参数指定为单个单词,然后使用type参数解析单词。我也会摆脱-i参数,并使用位置参数来获取所需的“选项”。

parser.add_argument('input', nargs='+', type=lambda x: x.rsplit(":", 2))

用法是

myscript.py myfile.txt:1 secondfile.txt:2 ...

答案 2 :(得分:0)

最好使用sys.argv作为

import sys, os

variables = list()
filenames = list()

if( len( sys.argv ) > 1 ):
    if( sys.argv[1] == '-i' )or( sys.argv[1] == '--input' ):
        N = len( sys.argv[1:] )
        for i in range( 2, N, 2 ):
            variables.append( int( sys.argv[i] ) )
            filenames.append( sys.argv[i+1] )

for file in filenames:
    # do something here
    os.system( 'less '+file )

我没有对此进行测试,但这应该可行。

答案 3 :(得分:0)

试试这个:

parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',
    required=True, nargs='+', action='append')

args = parser.parse_args()