Python 命令参数

24

我已经谷歌了将近一个小时,还是束手无策。

我需要一个脚本stupidadder.py,它可以将命令参数加2。

例如:python stupidadder.py 4

输出6

python stupidadder.py 12

输出14

到目前为止,我已经谷歌了以下内容:

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('x', metavar='x', type=int, nargs='+',
                    help='input number')

...

args = parser.parse_args()
print args
x = args['x']  # fails here, not sure what to put
print x + 2

我无法在任何地方找到一个简单明了的答案,文档太令人困惑了。:( 有人可以帮忙吗?谢谢。


为什么需要加2呢? - Tall Paul
搜索“Python命令行参数”,你一定会找到有用的链接。例如,第一个链接提供了Claudiu描述的技术。 - keyser
还可以参考这篇相关的帖子:https://stackoverflow.com/questions/27181084/how-to-iterate-over-arguments - undefined
6个回答

40

假设您正在学习如何使用argparse模块,那么您已经非常接近了。该参数是返回的args对象的一个属性,并被引用为x = args.x

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('x', metavar='x', type=int, nargs='+',
                    help='input number')

...

args = parser.parse_args()
print args
#x = args['x']  # fails here, not sure what to put
x = args.x
print x + 2

14

使用您的代码在IPython中运行的示例,显示args是一个简单的对象而不是字典。在argparse代码中,使用getattrsetattr访问命名空间。

In [4]: args=parser.parse_args(['12','4','5'])
In [5]: args
Out[5]: Namespace(x=[12, 4, 5])
In [6]: args['x']
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-3867439e1f91> in <module>()
----> 1 args['x']
TypeError: 'Namespace' object is not subscriptable
In [7]: args.x
Out[7]: [12, 4, 5]
In [8]: getattr(args,'x')
Out[8]: [12, 4, 5]
In [9]: sum(getattr(args,'x'))
Out[9]: 21

vars()可以用来将命名空间转换为字典。

In [12]: vars(args)['x']
Out[12]: [12, 4, 5]

请查看argparse文档的命名空间部分。


2
说实话,我会给可怕的第一部分打个负1分(我的意见哈哈),但是用于字典需求的vars技巧非常有用,所以加个正1分。 - jeromej

2
您只需像这样做:
x = args.x

2
由于您直接操作args命名空间对象,就好像它是一个字典一样,因此会引发异常。
TypeError: 'Namespace' object is not subscriptable

我的快速、个人化且不太美观的解决方法是使用内部字典,使用内部__dict__类型。

用户参数 = args.__dict__

如果您需要迭代参数并对其进行过滤,则这非常有用。


1
vars() 更好。https://dev59.com/LGQn5IYBdhLWcg3wY2TK - cbmanica
我强烈不同意。 - c24b
为什么?(实际上是一个问题,因为我认为我提供了一个有用的答案) - cbmanica
使用全局变量可能会产生强烈的隐藏副作用和缺乏可读性。基本上,我们不知道我们正在操作什么。除了你可以以更可读和更清晰的方式进行操作之外,使用全局变量被认为是一种不好的做法...我并不声称我的答案是更好的,但vars()是hackish的。 - c24b

0

可能是因为您有多个单词的变量,例如(这里有一个破折号): parser.add_argument('-d','--extracted-dir',type=str,...

要访问它,您可以使用: args.extracted_dir

您可能尝试过执行args['extracted-dir'],这就是您收到错误的原因。


-2

我不完全确定你的目标是什么。但如果那确实是你要做的全部,你不必变得非常复杂:

import sys
print int(sys.argv[1]) + 2

这里是相同的代码,但加入了更好的错误检查:

import sys

if len(sys.argv) < 2:
    print "Usage: %s <integer>" % sys.argv[0]
    sys.exit(1)

try:
    x = int(sys.argv[1])
except ValueError:
    print "Usage: %s <integer>" % sys.argv[0]
    sys.exit(1)

print x + 2

使用示例:

C:\Users\user>python blah.py
Usage: blah.py <integer>

C:\Users\user>python blah.py ffx
Usage: blah.py <integer>

C:\Users\user>python blah.py 17
19

1
谢谢!由于某种原因,Python文档中的示例根本没有提到这一点。http://docs.python.org/2/library/argparse.html虽然在文本中有所提及,但我希望从这个Python页面上得到更易读/可用的内容。 - user1601118

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接