31

我熟悉C,并且已经开始在python中进行实验。我的问题是关于sys.argv命令的。我读过它用于命令行解释器,但是当尝试执行一个简单的程序时,我没有得到我期望的结果。

代码:

import sys

a = sys.argv[1]
b = sys.argv[2]

print a, b

print a+b

输入:

python mySum.py 100 200

输出:

100 200
100200

当我添加两个参数时,它们被连接起来,而不是两个值被加在一起。似乎这些值被视为字符串。

如何将它们解释为数字?

4

6 回答 6

42

您可以使用 int() 将参数转换为整数

import sys

a = int(sys.argv[1])  b = int(sys.argv[2])

print a, b

print a+b

输入:python mySum.py 100 200

输出:

100 200
300
于 2012-05-25T09:36:10.693 回答
15

您还应该验证用户输入:

import sys

def is_intstring(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

for arg in sys.argv[1:]:
    if not is_intstring(arg):
        sys.exit("All arguments must be integers. Exit.")

numbers = [int(arg) for arg in sys.argv[1:]]
sum = sum(numbers)

print "The sum of arguments is %s" % sum
于 2012-05-25T12:46:26.597 回答
13

确实,你自己也发现了问题,sys.argv是一个字符串数组。

您可以使用 将字符串转换为整数int()。在这种情况下,例如:a = int(sys.argv[1])

于 2012-05-25T09:36:49.007 回答
5

sys.argv项目总是strings。您应该将它们投射到intwith int(a)

您还可以使用第三方库来处理 CLI 参数,例如OptParse

于 2012-05-25T09:37:43.467 回答
0

在 Python 中,字符串不会隐式转换为整数。尝试

num1 = int(sys.argv[1])
This would represent the numerical value of the number, not its string representation.
于 2014-10-17T01:24:26.613 回答
0

小心执行涉及命令行参数的比较,由于 Python 2 的比较不同类型的对象('int' < 'list' < 'string' < 'tuple')的策略,这可能会导致非常意外的行为,如此所述。在 Python 3 中,比较不同类型的对象会导致 TypeError。

有关对象比较混乱的示例,请尝试删除int()第 6.1.1 节中的调用。Python教程斐波那契代码,你会得到一个无限循环,因为while循环条件变成:'int'<'string'。(这在 Perl 中不会发生,顺便说一句)。

来自上述@Jan-Philip 的很好的建议是验证命令行参数,即使对于 Python 3 也是如此。

于 2017-07-06T23:40:17.293 回答