2009-06-15 6 views
0

Je coursImpossible d'avoir un paramètre de ligne de commande en Python

import sys 

print "x \tx^3\tx^3+x^3\t(x+1)^3\tcube+cube=cube+1" 

for i in range(sys.argv[2]):    // mistake here 
    cube=i*i*i 
    cube2=cube+cube 
    cube3=(i+1)*(i+1)*(i+1) 
    truth=(cube2==cube3) 

    print i, "\t", cube, "\t", cube + cube, "\t", cube3, "\t", truth 

Je reçois

Traceback (most recent call last): 
    File "cube.py", line 5, in <module> 
    for i in range(sys.argv[2]): 
IndexError: list index out of range 

Comment paramètre de ligne de commande peut vous utiliser comme suit dans le code?

Exemple d'utilisation

python cube.py 100 

Il devrait donner

x x^3 x^3+x^3 (x+1)^3 cube+cube=cube+1 
0 0 0 1 False 
1 1 2 8 False 
2 8 16 27 False 
--- cut --- 
97 912673 1825346  941192 False 
98 941192 1882384  970299 False 
99 970299 1940598  1000000  False 

Répondre

1

Je voudrais suggérer d'avoir un regard sur le module argparse de Python, ce qui est une amélioration de géant dans l'analyse des paramètres de ligne de commande - il peut aussi faire la conversion en int pour vous y compris le type vérification et erreur de rapports/génération d'aide messages.

+0

Merci pour votre réponse! S'il vous plaît, pensez à ajouter le code comment faire cela dans 3.2. Il semble être fondamentalement ** pour i dans la gamme (sys.argv [1]) ** juste sans la conversion de type. –

6

Utilisation:

sys.argv[1] 

noter également que les arguments sont toujours des chaînes, et range Renvoie un entier.

donc le bon code serait:

au lieu de 2.
for i in range(int(sys.argv[1])): 
+0

Merci pour votre réponse! –

1

Son sys.argv [1] Vous voulez également fait en sorte que vous convertir en un entier si vous faites des calculs avec elle .

donc au lieu de

for i in range(sys.argv[2]): 

vous voulez

for i in range(int(sys.argv[1])): 
2

Voici quelques conseils sur la façon dont vous pouvez souvent résoudre ce type de problème vous:

Lisez ce que le message d'erreur vous dit: "liste index hors de portée".

Dans quelle liste? Deux choix (1) la liste renvoyée par range (2) sys.argv

Dans ce cas, il ne peut pas être (1); il est impossible d'obtenir cette erreur sur for i in range(some_integer) ... mais vous ne le savez peut-être pas, donc en général, s'il y a plusieurs choix dans une ligne pour la source d'une erreur, et vous ne pouvez pas voir quelle est la cause, diviser la ligne en deux ou plusieurs instructions:

num_things = sys.argv[2] 
for i in range(num_things): 

et de réexécuter le code.

Nous savons maintenant que sys.argv est la liste. Quel indice? Doit être 2. Comment se fait-il que c'est hors de portée? Réponse basée sur la connaissance: car Python compte les index de liste à partir de 0.réponse basée sur l'expérimentation: Insérer cette ligne avant la ligne d'échec:

print list(enumerate(sys.argv)) 

Vous avez donc besoin de changer le [2] [1]. Ensuite, vous obtiendrez une autre erreur, car dans la plage (n), le n doit être un entier, pas une chaîne ... et vous pouvez résoudre ce nouveau problème de la même manière - astuce supplémentaire: recherchez range() dans le docs.

+0

Je suis entièrement d'accord avec vous. Je vois maintenant quel était mon problème: J'ai recherché Python-doc par les mots-clés "paramètre" et "arg" sans trouver le type de paramètre de gamme. Il est clairement préférable de rechercher les docs Python au moins dans ce cas avec "range". –

+0

John explique très bien comment déboguer de telles choses, je voudrais ajouter qu'un shell Python interactif (de préférence iPython) peut être d'une grande aide pour déterminer comment certaines parties fonctionnent ... – he1ix

Questions connexes