2012-05-25 4 views
17

Я знаком с C и начал экспериментировать на python. Мой вопрос касается команды sys.argv. Я читал, что он используется для интерпретатора командной строки, но при попытке выполнить простую программу я не получаю ожидаемых результатов.Аргументы командной строки в python.

Код:

import sys 

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

print a, b 

print a+b 

Вход:

python mySum.py 100 200 

Выход:

100 200 
100200 

Когда я добавляю два аргумента они сцепляются вместо того, чтобы эти два значения суммируются. Кажется, что значения берутся как строки.

Как я могу интерпретировать их как числовые значения?

+1

Аналогичная проблема возникает в аргументах C: аргументы передаются в 'main()' как строки, и вам нужно будет использовать 'sscanf()' или 'atoi()' для преобразования их в целые числа. –

+0

Это очень расплывчатое название. Может ли кто-нибудь отредактировать его, чтобы точно описать вопрос? –

ответ

23

Вы можете преобразовать аргументы целых чисел, используя 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 
11

В самом деле, вы нашли проблему самостоятельно, sys.argv является массив строк.

Вы можете преобразовать строку в целое число с int(). В этом случае, например: a = int(sys.argv[1])

+0

Спасибо, Питер Смит .. – Kalyan

4

sys.argv товары всегда strings. вы должны отдать их int с int(a).

Вы также можете использовать сторонние библиотеки для обработки аргументов CLI, таких как OptParse.

10

Вы также должны подтвердить ввод данных пользователем:

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 
+0

Я собирался написать новый ответ, в котором говорится, что нужно проверить его перед использованием int(), прежде чем я увижу ваш ответ! Можно также использовать isdigit(), который возвращает TRUE, если все символы в строке (0-9). –

0

В Python, строки не неявно преобразованы в целые числа. Попробуйте

num1 = int(sys.argv[1]) 
This would represent the numerical value of the number, not its string representation. 
0

Остерегайтесь выполнением сравнений с участием аргументы командной строки, которые могут привести к действительно неожиданному поведению благодаря Python 2 в политику для сравнения объектов различных типов («INT» < «списка» < «строки '<' tuple '), как указано here. В Python 3 сравнение объектов разных типов приведет к TypeError.

Для примера погрешности сравнения объектов попробуйте удалить вызов в разделе 6.1.1. из Python tutorial Fibonacci code, и вы получите бесконечный цикл, так как условие цикла while становится: 'int' < 'string'. (Это не произойдет в Perl, кстати).

Отличный совет от @ Jan-Philip выше, чтобы проверить аргументы командной строки, даже для Python 3.

Смежные вопросы