2016-04-19 2 views
1

Я новичок в Python и почти не знаю о списках и кортежах. У меня есть программа для выполнения, которая принимает несколько значений в качестве входных аргументов. Ниже приведен список входных аргументовPython передает несколько строк в один аргумент командной строки

parser = argparse.ArgumentParser() 
parser.add_argument("server") 
parser.add_argument("outdir") 
parser.add_argument("dir_remove", help="Directory prefix to remove") 
parser.add_argument("dir_prefix", help="Directory prefix to prefix") 
parser.add_argument("infile", default=[], action="append") 
options = parser.parse_args() 

Программа прекрасно работает с помощью следующей команды

python prod2dev.py mysrv results D:\Automations D:\MyProduction Automation_PP_CVM.xml 

Но глядя на код, похоже, код может принимать несколько имен файлов для аргумента «INFILE» , Я пробовал следовать за несколькими именами файлов, но никто не работал.

python prod2dev.py mysrv results D:\Automations D:\MyProduction "Automation_PP_CVM.xml, Automation_PT_CVM.xml" 

python prod2dev.py mysrv results D:\Automations D:\MyProduction ["Automation_PP_CVM.xml", "Automation_PT_CVM.xml"] 

python prod2dev.py mysrv results D:\Automations D:\MyProduction ['Automation_PP_CVM.xml', 'Automation_PT_CVM.xml'] 

python prod2dev.py mysrv results D:\Automations D:\MyProduction ['"Automation_PP_CVM.xml"', '"Automation_PT_CVM.xml"'] 

Код ниже, по-видимому обхода списка

infile = windowsSucksExpandWildcards(options.infile) 
for filename in infile: 
    print(filename) 
    outfilename = os.path.join(options.outdir, os.path.split(filename)[1]) 
    if os.path.exists(outfilename): 
     raise ValueError("output file exists: {}".format(outfilename)) 

    with open(filename, "rb") as f: 
     root = lxml.etree.parse(f) 
    if not isEnabled(root): 
     print("Disabled. Skipping.") 
     continue 
    elif not hasEnabledTriggers(root): 
     print("Has no triggers") 
     continue 
... 
... 
... 
def windowsSucksExpandWildcards(infile): 
    result = [] 
    for f in infile: 
     tmp = glob.glob(f) 
     if bool(tmp): 
      result.extend(tmp) 
     else: 
      result.append(f) 
    return result 

Пожалуйста, руководство о том, как передать несколько имен файлов (строки) к одному аргументу «INFILE», который, по-видимому список.

Я бегу на Python 3.5.1 | Anaconda 4.0.0 (32-разрядная версия)

ответ

3

Вы передаете nargs аргумент, а не action="append":

parser.add_argument("infile", default=[], nargs='*') 

* означает ноль или больше, так же, как в регулярных выражениях. Вы также можете использовать +, если требуется хотя бы один. Поскольку у вас есть значение по умолчанию, я предполагаю, что пользователь не обязан передавать какие-либо данные.

+0

И что лучший способ назвать программу? – Ali

+0

@Ali: Как и ваша первая попытка, но без кавычек и без запятых. Кавычки используются для создания одного аргумента, который будет более одного. В этом случае они должны быть отдельными аргументами. Эти запятые интерпретируются как запятые, а не разделители. Пространство является разделителем. – zondo

0

Ваш код, из которого вы только что опубликовали, выглядит солидно.

Проблема заключается в том, что вы опубликовали фрагмент, который должен пересекать список. Образом, ваша программа установки вы не можете использовать infile как переменная

Все, что вам нужно сделать, чтобы исправить это переключатель infile с options.infile

В частности:

for filename in options.infile: 
    print(filename) 

Причиной этого является все ваши аргументы сохраняются в опциях «Пространство имен» - переменная типа

+0

Мой плохой. Хотел скрывать сложность. См. Мое редактирование – Ali

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