我熟悉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
当我添加两个参数时,它们被连接而不是两个值一起添加。似乎这些值被视为字符串。
我怎样才能将它们解释为数字?
答案 0 :(得分:30)
您可以使用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
答案 1 :(得分:12)
您还应验证用户输入:
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
答案 2 :(得分:11)
确实,您自己发现了问题,sys.argv
是一个字符串数组。
您可以使用int()
将字符串转换为整数。例如:a = int(sys.argv[1])
答案 3 :(得分:4)
sys.argv
项始终为strings
。你应该使用int
将它们转换为int(a)
。
您还可以使用第三方库来处理CLI参数,例如OptParse。
答案 4 :(得分:0)
在Python中,字符串不会隐式转换为整数。 尝试
num1 = int(sys.argv[1])
This would represent the numerical value of the number, not its string representation.
答案 5 :(得分:0)
谨防执行涉及命令行参数的比较,由于Python 2的策略用于比较不同类型的对象(' int&#39),这可能导致真正意外行为;<"' list'<' string'<' tuple'),如上所述here。在Python 3中,比较不同类型的对象将导致TypeError。
有关对象比较混乱的示例,请尝试删除第6.1.1节中的int()
调用。在Python tutorial Fibonacci code中,你会得到一个无限循环,因为while循环条件变为:' int' < '串&#39 ;. (这不会发生在Perl,顺便说一下。)
来自@ Jan-Philip的很好的建议来验证命令行参数,即使对于Python 3也是如此。