2012-05-25 4 views
17

Jestem zaznajomiony z C i zacząłem eksperymentować w Pythonie. Moje pytanie dotyczy polecenia sys.argv. Przeczytałem, że jest używany dla interpretera wiersza poleceń, ale kiedy próbuję wykonać prosty program, nie otrzymuję oczekiwanych rezultatów.Argumenty wiersza poleceń w pythonie.

Kod:

import sys 

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

print a, b 

print a+b 

Wejście:

python mySum.py 100 200 

wyjściowa:

100 200 
100200 

Kiedy dodać dwa argumenty one są łączone zamiast te dwie wartości są sumowane. Wydaje się, że wartości są traktowane jako łańcuchy.

Jak interpretować je jako liczby?

+1

Podobny problem wystąpiłby w C: argumenty są przekazywane do 'main()' jako łańcuchy i trzeba by użyć 'sscanf()' lub 'atoi()' aby przekonwertować je na liczby całkowite. –

+0

To jest bardzo ogólnikowy tytuł. Czy ktoś może go edytować, aby dokładnie opisać pytanie? –

Odpowiedz

23

można przekonwertować argumenty do liczb całkowitych przy użyciu int()

import sys 

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

print a, b 

print a+b 

wejściowe: python mySum.py 100 200

wyjściowa:

100 200 
300 
11

Rzeczywiście, znalazłeś problem siebie, sys.argv jest tablica łańcuchów.

Możesz przekształcić ciąg na liczbę całkowitą z int(). W tym przypadku na przykład: a = int(sys.argv[1])

+0

Dzięki Peter Smit .. – Kalyan

4

sys.argv przedmioty są zawsze strings. powinieneś rzucić je do int z int(a).

Można również użyć bibliotek stron trzecich do obsługi argumentów CLI, takich jak OptParse.

10

też należy sprawdzić poprawność danych wejściowych użytkownika:

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

Chciałem napisać nową odpowiedź, która mówi, że należy ją sprawdzić przed użyciem int(), zanim zobaczyłem twoją odpowiedź! Można również użyć isdigit(), która zwraca TRUE, jeśli wszystkie znaki w łańcuchu są (0-9). –

0

W Pythonie ciągi nie są niejawnie konwertowane do liczb całkowitych. Spróbuj

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

Strzeż przeprowadzania porównań obejmujących argumenty wiersza poleceń, co może prowadzić do naprawdę nieoczekiwane zachowanie dzięki polityce Python 2 dla porównywania obiektów różnych typów („int” < „list” < „string "<" krotka "), jak podano here. W Pythonie 3 porównywanie obiektów różnych typów doprowadzi do TypeError.

Dla przykładu chaosu porównywania obiektów, spróbuj usunąć wywołanie int() w sekcji 6.1.1. z Python tutorial Fibonacci code, a otrzymasz nieskończoną pętlę, ponieważ warunek pętli while staje się: 'int' < 'string'. (To się nie stanie w Perlu, btw).

Świetna rada od @ Jan-Philipa powyżej do sprawdzania poprawności argumentów wiersza poleceń, nawet w przypadku Pythona 3.