2015-07-06 18 views
0

Извините, что задал основной вопрос, но его сложно найти в Google. В любом случае, у меня есть программа, которая выполняет математику из чисел, найденных в различных файлах .txt. одна вещь, которую я хотел бы добавить, - это аргумент -show, показывающий математику шаг за шагом (поиск ошибок в математике, поиск чисел с шагов certian и т. д.). Я его настроить в коде следующим образом:Вопрос о sys.argv (python)

import sys 
sys.argv[0] 
filename = sys.argv[1] 
prop = sys.argv[2] 
show = sys.argv[3] 
    if show == "-show": 
     show = 1 

(показать = 1 делает что-то позже). моя проблема в том, когда я ничего не ставить на sys.argv [3], как если бы я поставил:

python program.py examplefile.txt exampleline 

тогда программа не работает, я знаю, что это becauce он ожидает аргумент и вот почему его испортить, но есть ли способ сказать, что sys.argv [3] не всегда используется и может быть пустым?

+2

'argparse' может быть для вас библиотека! – NightShadeQueen

+2

это может вызвать проблемы, если вы применяете неструктурированное мышление. использование существующего анализатора аргументов может сэкономить ваш день, например 'argparse',' getopt', 'getopts'. – HuStmpHrrr

+0

Кроме того, если вы ориентируетесь на Linux, не используйте один тире для длинных параметров, например 'show'. Либо вы делаете это однобуквенный флаг (например, '-s'), либо длинный вариант с двумя тире (' --show'), но если вы привыкли делать такие вещи, как '-show', люди будут ненавидеть ваши программы, потому что они нарушат [Принцип наименьшего сюрприза] (https://en.wikipedia.org/wiki/Principle_of_least_astonishment), не поддерживая широко поддерживаемую часть стандарта POSIX. –

ответ

0

Вы должны получать IndexError на этой строке при запуске без третьего аргумента. Если вы не получаете IndexError, что-то еще не так, и вы должны это исправить. Если вы, все хорошо - и вам просто нужно проверить длину sys.argv, принимая во внимание в своем коде, что должно произойти, когда это значение равно 3 или 4:

if len(sys.argv) == 3: 
    # Stuff without sys.argv[3] 
if len(sys.argv) == 4: 
    # Stuff with sys.argv[3] 
+0

круто я попробую. Благодарю. – bofimpact

+0

извините, но не могли бы вы объяснить, что вы имеете в виду под действием вещей, я думаю, что я понимаю, но im not positive – bofimpact

+0

Это случайный комментарий заполнителя, чтобы показать вам, где разместить фактический код. – John

1

Вы можете проверить длину sys.argv, но зачем беспокоиться? Используйте TRY/поймать:

try: flag = sys.argv[1] 
except: flag = False 

Таким образом, переменная flag всегда имеет значение, и вы можете написать коду, знает, что она всегда имеет значение. В коде меньше строк, чем при тестировании if/else. Это победа вокруг.

+0

ok cool Я тоже могу попробовать. – bofimpact

+0

Это не работает, мне нужно поместить его в определенную область в скрипте? Я попытался: flag = sys.argv [1] сразу после импорта sys.также должен остаться [1] или изменить его на [3] – bofimpact

+0

Вы должны изменить это на '[3]', если третий аргумент является необязательным. –

1

На стороне записки, было бы хорошо, чтобы оформить argparse модуль в питона, из документации -

Модуль argparse позволяет легко писать дружественный интерфейс командной строки. Программа определяет, какие аргументы она требует, а argparse будет определять, как разбирать их из sys.argv. Модуль argparse также автоматически генерирует сообщения справки и использования и выдает ошибки, когда пользователи приводят неверные аргументы программы.

Он также поддерживает дополнительные аргументы. Возможно, вы можете взглянуть на this, чтобы начать с этого.

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