web-dev-qa-db-fra.com

Les nombres passés comme arguments de ligne de commande en python ne sont pas interprétés comme des entiers

Je connais bien C et ai commencé à expérimenter en python. Ma question concerne la commande sys.argv. Je l'ai lu est utilisé pour un interpréteur de ligne de commande, mais lorsque j'essaye d'exécuter un programme simple, je n'obtiens pas les résultats escomptés.

Code:

import sys

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

print a, b

print a+b

Contribution:

python mySum.py 100 200

Sortie: 

100 200
100200

Lorsque j'ajoute les deux arguments, ils sont concaténés à la place des deux valeurs ajoutées. Il semble que les valeurs sont considérées comme des chaînes.

Comment puis-je les interpréter comme des nombres?

22
Kalyan

Vous pouvez convertir les arguments en entiers en utilisant int ()

import sys

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

print a, b

print a+b

entrée: python mySum.py 100 200

sortie:

100 200
300
28
Wesley

Vous devez également valider la saisie de l'utilisateur:

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
11

En effet, vous avez trouvé le problème vous-même, sys.argv est un tableau de chaînes.

Vous pouvez transformer une chaîne en un entier avec int(). Dans ce cas par exemple: a = int(sys.argv[1])

11
Peter Smit

Les éléments sys.argv sont toujours strings. vous devriez les lancer dans int avec int(a).

Vous pouvez également utiliser des bibliothèques tierces pour gérer les arguments CLI tels que OptParse .

4
Andy Terra

En Python, les chaînes ne sont pas implicitement converties en entiers . Try

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

Méfiez-vous des comparaisons impliquant des arguments de ligne de commande, car elles pourraient conduire à un comportement inattendu de type [] du fait de la politique de Python 2 relative à la comparaison d'objets de types différents ('int' <'list' <'chaîne' <'Tuple') noté ici . En Python 3, comparer des objets de types différents mènera à une erreur TypeError.

Pour un exemple de comparaison d'objets, essayez de supprimer l'appel int() dans la section 6.1.1. du tutoriel Python Code Fibonacci et vous obtiendrez une boucle infinie, car la condition de la boucle while devient: 'int' <'string'. (Cela ne se produirait pas en Perl, d'ailleurs).

Le bon conseil de @ Jan-Philip ci-dessus pour valider les arguments en ligne de commande, même pour Python 3.

0
Trutane