在python

时间:2016-06-16 11:16:15

标签: python argparse

我试图通过命令行参数传递参数来追加一个url。以下是我的尝试方法:

import argparse
parser = argparse.ArgumentParser(description='Arguments')
parser.add_argument('input', metavar='input', type=str)
parser.add_argument('output', metavar='text', type=str)
args = parser.parse_args()
url = 'https://example.com/?z=12&text='+args.output+'&loc{}'
print url

执行时

python url.py text.csv hello

它将第二个传递的参数附加到url。我想知道如何使第二个参数可选,这样即使不提供第二个参数,我也希望通过连接到url来打印url。这是我期待的输出:

当两个论点都给出时:

python url.py text.csv hello

输出应为

https://example.com/?z=12&text=hello&loc{}

当给出单个参数时

python url.py text.csv

输出应为

https://example.com/?z=12&text=&loc{}

2 个答案:

答案 0 :(得分:5)

尝试nargs='?'并定义default

import argparse
parser = argparse.ArgumentParser(description='Arguments')
parser.add_argument('input', metavar='input')
parser.add_argument('output', metavar='text', nargs='?', default='')
args = parser.parse_args()
url = 'https://example.com/?z=12&text='+args.output+'&loc{}'
print url

当我只用一个命令行字符串测试它时,args.output是默认值:

In [91]: args = parser.parse_args(['one'])

In [92]: args
Out[92]: Namespace(input='one', output='')

In [93]: args = parser.parse_args(['one','two'])

In [94]: args
Out[94]: Namespace(input='one', output='two')

最好只使用nargs='?'(或' *'或' +')和最后一个位置参数。可以在之前的版本中使用它,但有一些复杂功能可以让你回答更多问题。

答案 1 :(得分:1)

在我看来,你有两种选择。要么你完全避免使用argparse,要么采取类似的行为:

import sys
args_input  = sys.argv[1]
args_output = sys.argv[2] if len(sys.argv) > 2 else ''
url = 'https://example.com/?z=12&text='+args_output+'&loc{}'
print url

或者您将-添加到可选参数中,并且如Ignacio's reply所示,您为output参数设置默认空值:

import argparse
parser = argparse.ArgumentParser(description='Arguments')
parser.add_argument('input', metavar='input', type=str)
parser.add_argument('-output', metavar='text', type=str, default='')
args = parser.parse_args()
url = 'https://example.com/?z=12&text='+args.output+'&loc{}'
print url

使用第二个选项,您必须将其称为:

python url.py text.csb -output hello

或者

python url.py text.csb

但是如果你想在之后添加更多的参数,它会更具扩展性。