2015-11-10 2 views
0

Я хочу отправить аргументы скрипту по их имени (что-то вроде kwargs). я пытался что-то вроде этого, но это не делает то, что я хочу: (скажем, это написано в script.py)named аргумент в argparse

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("name") 
args = parser.parse_args() 

, а затем писать в commant линии: script.py имя = Дэвид

другое дело , допустим, у меня мало аргументов в argparse. Если я пошлю их не в том порядке, в котором они объявлены, будет ли он работать хорошо?

+0

Эта ссылка может помочь HTTP://stackoverflow.com/a/22045954/1394473 – tom

ответ

0

Порядок не имеет значения.

Измените аргумент

parser.add_argument('-name') 

Кроме того, что случилось это ваш вызов из командной строки. Он должен выглядеть следующим образом:

python script.py name david 
1

В argparse и ранее командной строки переработчиков одного и того же стиля, что есть различие между «» или дополнительными опциями, помеченных аргументами и positionals.

«optionals» сигнализируются строкой флага, что-то вроде -f или --foo. Они аналогичны аргументам ключевого слова функций Python, но не идентичны. Приказ не имеет значения. С ограничениями флаги могут быть объединены со значениями, например. -f1, --foo=astring.

'Позиции' идентифицируются по заказу, без какого-либо идентифицирующего имени. Они аналогичны функциям Python args. В функциях все позиционные аргументы должны встречаться перед ключевыми словами. С argparse «optionals» могут смешиваться с «позициями» - с некоторыми ограничениями. Обычно все позиционеры поставляются после опций, как указано в сообщении об использовании argparse.

Посмотрите примеры в документации argparse.

Периодически мы получаем вопросы от людей, которые хотят обойти эти соглашения, например, ожидать использования флага без символов префикса или вводить словарные словарные пары, foo=test или foo:test. Некоторые из них возможны, но требуется больше работы. И, как правило, для небольшой выгоды в ясности и полезности.

Я предлагаю передать script.py name = david сценарию, который отображает только список sys.argv. Это значения, с которыми необходимо работать argparse. Я ожидаю, что вы увидите:

['script.py', 'name', '=', 'david'] 

Ваша оболочка разделила эту командную строку на отдельные строки. Вероятно, проще сделать свой собственный анализ этого списка, чем перевернуть argparse в форму, которая будет.

Argparse может легко обрабатывать входы, как

script.py --name david 
script.py --name=david 
script.py david 
3

Вопрос, как говорится, содержит немного непонимания, или у меня большой.

* ключевое слово и ** ключевое слово предназначены для передачи параметров/материала классам/функциям/методам ВНУТРИ кода питона.

argparse используется для передачи аргументов/опций в программу python извне/в командной строке. Таким образом, вы не получите 1 на 1 репликацию. Однако argparse довольно настраивается, и в зависимости от того, как вы хотите это сделать, вы можете приблизиться.

Если вы хотите, чтобы передать одно имя, то:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("name") 
args = parser.parse_args() 

print args 

позволит вам:

$ ./pytest.py dave 
Namespace(name='dave') 

Если вы хотите установить имя, так что вы можете отправить другие вещи, а также:

parser.add_argument("-name") 

Позвольте вам:

./pytest.py -name dave 
Namespace(name='dave') 

но извещение:

./pytest.py -name dave -name steve 
Namespace(name='steve') 

Однако:

parser.add_argument("--name") 

позволит/потребовать:

./pytest.py --name dave 
Namespace(name='dave') 

./pytest.py --name=dave 
Namespace(name='dave') 

и если вы:

parser.add_argument("--name", nargs="+") 

./pytest.py --name dave steve murphy 
Namespace(name=['dave', 'steve', 'murphy']) 

Но:

./pytest.py --name=dave --name=steve --name=murphy  
Namespace(name= ['murphy']) 

(обратите внимание, что это последний один список только Murphy в нем.)

Так что вы можете сделать, это:

parser.add_argument("--name") 
parser.add_argument("--email") 
parser.add_argument("--hair-color") 

./pytest.py --name fred --hair-color murphy --email [email protected] 
Namespace(email='[email protected]', hair_color='murphy', name='fred')