Python, argparse.А как насчет -opt1 -part-of-opt1 <parameter>? - PullRequest
0 голосов
/ 12 сентября 2018
parser.add_argument('-i', required=True)  # One directory path
parser.add_argument('-d', required=True)  # Output database path
parser.add_argument('-t', required=True)  # DDL-script path
parser.add_argument('-c -i', required=True) # Another directory path

Я запускаю .py сценарий, подобный этому:

python.exe s.py -c -i D:\Temp\dir1 -d D:\Temp\out.db -t D:\Temp\ddl.sql -i D:\Temp\dir2

и получаю ошибку:

usage: s.py [-h] -i I -d D -t T -c -i C _I
s.py: error: argument -c -i: expected one argument

Как я могу использовать его без аргумента переименованияимена ??

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Посмотрите на список sys.argv[1:]. Я ожидаю, что это будет

['-c', '-i', 'D:\Temp\dir1', '-d', 'D:\Temp\out.db', '-t', 'D:\Temp\ddl.sql', '-i', 'D:\Temp\dir2']

Обратите внимание, что '-c -i' разделены. Поскольку сокращения допускаются, -c принимается как сокращение для этого флага '-c -i'. Но за этой строкой следуют '-i' и 'D: ...'. Это 2 аргумента, а не только один. Отсюда и ошибка.

Да, вы можете заключить в кавычки "-c -i", чтобы оболочка не разделяла его, но даже это не работает корректно. Я не вижу смысла указывать такой флаг. Он не основан на ранее определенном действии '-i'.

In [113]: parser.parse_args(['-c -i', 'D:\Temp\dir1', '-d', 'D:\Temp\out.db', 
   '-t', 'D:\Temp\ddl.sql', '-i', 'D:\Temp\dir2'])
Out[113]: Namespace(d='D:\\Temp\\out.db', i='D:\\Temp\\dir2', 
   t='D:\\Temp\\ddl.sql', **{'c _i': 'D:\\Temp\\dir1'})
In [122]: getattr(Out[113],'c _i')
Out[122]: 'D:\\Temp\\dir1'
0 голосов
/ 12 сентября 2018

Чтобы уточнить комментарий user2357112, это «составное имя» не вещь.Сверху головы я не могу назвать ни одного флага одной программы, которая делает это.

Даже если вам удастся реализовать это (нет ничего невозможного, хотя argparse мало поможет), это решение по проектированию было бы очень удивительно для пользователей вашей программы.

...