2016-04-13 3 views
0

Я хочу сделать скрипт в Python, который будет работать с моим ARGV, но когда я пытаюсь этот простой, если-Элиф, он не возвращает мне ничегоPython, если-Элиф ARGV возвращение

import sys 

if len(sys.argv) == 1: 
     add = str(sys.argv[1]) 
     print add 
elif len(sys.argv) == 2: 
     add = str(sys.argv[1]) 
     add2 = str(sys.argv[2]) 
     print add + add2 
elif len(sys.argv) > 4: 
     print "too many" 

Может кто-нибудь объяснить мне, почему, когда я бегу сценарий как это:

$ python test.py 5 6

и результат ничего, только если я бегу это один

$ python test.py 5 6 7 8 результатов слишком много

+0

Если вы печатаете 'sys.argv', причина будет становятся очевидными. – vaultah

+1

также у вас нет случая для 'len (sys.argv) == 3', поэтому при запуске' python test.py 5 6' вы ничего не получаете – smead

+0

Также имейте в виду, что 'if len (sys. argv) == 1: ', а затем доступ к' add = str (sys.argv [1]) 'будет поднять IndexError. Это должно быть 'sys.argv [0]'. – Xiflado

ответ

1

Согласно комментариям и anwers уже данных, это обновление программы должно работать нормально:

import sys 

if len(sys.argv) == 2: 
    print(sys.argv[1]) 
elif len(sys.argv) == 3: 
    print(str(sys.argv[1]) + str(sys.argv[2])) 
elif len(sys.argv) > 3: 
    print("too many") 

Я советую вам, чтобы напечатать все, что не является ясным для тебя. С простым print(sys.argv) вы бы получили ['test.py', '3', '4']. Я всегда делаю такие быстрые тесты, прежде чем идти в документацию, и это экономит мне много времени;).

+0

, но когда я хочу проверить, есть ли в моей командной строке специальные параметры, такие как -i, -m ... как я могу это сделать, я пробовал вот так, но никак ... если len (sys.argv) == 3: if sys.argv [2] == "-i": add = str (sys.argv [3]) напечатать добавить –

+0

специальные опции (т. е. 'python test.py -i 42 --force') работают одинаково. Когда я печатаю 'sys.argv' с предыдущим примером, я получаю:' ['test.py', '-i', '42', '--force'] '. Тогда вы можете сделать 'sys.argv [1] ==" -i "' в вашем if-заявлении без каких-либо проблем. –

+0

Хорошо, я думаю, что нашел ошибку: 'if len (sys.argv) == 3: if sys.argv [1] ==" -i ": add = str (sys.argv [2]) print add'. Индекс в списке начинается с 0, вы использовали индекс 3, который не связан. ;) –

1

sys.argv[0] это имя вашего скрипта. Параметры начинаются с 1. Таким образом, в первом случае, ваш sys.argv на самом деле что-то вроде ['test.py', '5', '6']

+0

да, я понял сейчас, забыл, что первый argv - это имя скрипта, спасибо !!! –

+0

, но когда я хочу проверить, есть ли в моей командной строке специальные параметры, например -i, -m ... как я могу это сделать, я пробовал вот так, но никак ... если len (sys.argv) == 3: if sys.argv [2] == "-i": add = str (sys.argv [3]) print add –

+1

@AlexV: Если 'len (sys.argv) == 3' then' sys .argv' - это список с 3 элементами, поэтому 'sys.argv [3]' ** не существует **. Вы _can_ обрабатываете командную строку args вручную, но гораздо лучше использовать модуль. Для Python 2.7 или более поздней версии есть 'argparse', как упоминалось выше Дэвидом Миро. Для более старых версий Python вы можете использовать [getopt] (https://docs.python.org/2/library/getopt.html#module-getopt). –

2

Пример использования модуля argparse. Позиционные аргументы являются обязательными и не позволяют параметры, а необязательные аргументы допускают N параметров.

from argparse import ArgumentParser 

parser = ArgumentParser(description='%(prog)s is a argparse demo') 

# Optional argument that requires two arguments 
parser.add_argument('-two_args', nargs=2) 

# Optional argument that requires 1 to N arguments 
parser.add_argument('-one_n_args', nargs='+') 

# Optional argument that requires 0 to N arguments 
parser.add_argument('-zero_n_args', nargs='*') 

args = parser.parse_args() 
print 'args.two_args:', args.two_args 
print 'args.one_n_args:', args.one_n_args 
print 'args.zero_n_args:', args.zero_n_args 

тест:

C:\>python demo.py --help 
usage: demo.py [-h] [-two_args TWO_ARGS TWO_ARGS] 
       [-one_n_args ONE_N_ARGS [ONE_N_ARGS ...]] 
       [-zero_n_args [ZERO_N_ARGS [ZERO_N_ARGS ...]]] 

demo.py is demo 

optional arguments: 
    -h, --help   show this help message and exit 
    -two_args TWO_ARGS TWO_ARGS 
    -one_n_args ONE_N_ARGS [ONE_N_ARGS ...] 
    -zero_n_args [ZERO_N_ARGS [ZERO_N_ARGS ...]] 

C:\>python demo.py -two_args 1 
usage: demo.py [-h] [-two_args TWO_ARGS TWO_ARGS] 
       [-one_n_args ONE_N_ARGS [ONE_N_ARGS ...]] 
       [-zero_n_args [ZERO_N_ARGS [ZERO_N_ARGS ...]]] 
demo.py: error: argument -two_args: expected 2 argument(s) 

C:\>python demo.py -two_args 1 2 -one_n_args x -zero_n_args 
args.two_args: ['1', '2'] 
args.one_n_args: ['x'] 
args.zero_n_args: [] 

C:\>python demo.py -two_args 1 2 -one_n_args x -zero_n_args a b c d 
args.two_args: ['1', '2'] 
args.one_n_args: ['x'] 
args.zero_n_args: ['a', 'b', 'c', 'd'] 

время назад я написал запись в моем блоге (на испанском языке, я извиняюсь) http://www.3engine.net/wp/2015/02/argparse-modulo-de-analisis-de-linea-de-comandos-para-python/

+0

Я могу сделать 2 раза args = parser.parse_args() ?? like args = parser.parse_args() и args1 = parser.parse_args() –

+0

Я хочу, чтобы в 1 парсере задавалось значение по умолчанию, которое я создаю после args = parser.parse_args(), поэтому у меня есть ошибка, если я хотите использовать, сказал, что не определено, что значение по умолчанию –

+0

Может быть, я могу помочь себе указать значение по умолчанию, что-то вроде 'parser.add_argument ('- opt4', help = 'help for opt4', type = int, default = 10) '. Вы также можете указать, что требуется аргумент 'parser.add_argument ('- opt6', required = True)' –

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