Невозможно иметь параметр командной строки в Python - PullRequest
0 голосов
/ 16 июня 2009

Я бегу

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

Я получаю

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

Как использовать параметр командной строки в коде следующим образом?

Пример использования

python cube.py 100

Это должно дать

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

Ответы [ 5 ]

6 голосов
/ 16 июня 2009

Использование:

sys.argv[1]

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

Таким образом, правильный код будет:

for i in range(int(sys.argv[1])):
3 голосов
/ 16 июня 2009

Вы хотите int(sys.argv[1]), а не 2.

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

Редактировать: см. http://www.faqs.org/docs/diveintopython/kgp_commandline.html

2 голосов
/ 16 июня 2009

Вот несколько советов о том, как часто вы можете решить эту проблему самостоятельно :

Прочтите, что говорит вам сообщение об ошибке: «индекс списка вне диапазона».

Какой список? Два варианта (1) список, возвращаемый range (2) sys.argv

В этом случае это не может быть (1); невозможно вытащить эту ошибку из for i in range(some_integer) ... но вы, возможно, этого не знаете, поэтому в общем случае, если в строке есть несколько вариантов выбора источника ошибки, и вы не видите, в чем причина, разбейте строку на две или более заявления:

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

и снова запустите код.

К настоящему времени мы знаем, что sys.argv - это список. Какой индекс? Должно быть 2. Почему это выходит за пределы диапазона? Ответ на основе знаний: поскольку Python считает индексы списка от 0. Ответ на основе эксперимента: вставьте эту строку перед ошибочной строкой:

print list(enumerate(sys.argv))

Так что вам нужно изменить [2] на [1]. Тогда вы получите еще одну ошибку, потому что в range (n) n должно быть целым числом, а не строкой ... и вы можете справиться с этой новой проблемой аналогичным образом - дополнительный совет: посмотрите в range () Docs.

1 голос
/ 07 июля 2014

Я хотел бы предложить взглянуть на модуль Python argparse, который является гигантским улучшением в разборе параметров командной строки - он также может сделать преобразование в int для вас, включая type- проверка и создание отчетов об ошибках / генерация справочных сообщений.

1 голос
/ 16 июня 2009

Это sys.argv [1] вместо 2. Вы также хотите убедиться, что вы конвертируете это в целое число, если вы делаете с ним математику.

так вместо

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

хочешь

for i in range(int(sys.argv[1])):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...