Использование optparse или argparse для обработки нескольких аргументов с использованием одной и той же опции - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь написать скрипт на python, который может отображать все, что пользователь вводит при запуске скрипта

Сейчас у меня есть код (version_msg и creation_msg сейчас не имеют значения)

from optparse import OptionParser 

version_msg = ""
usage_msg = ""
parser = OptionParser(version=version_msg, usage=usage_msg)
parser.add_option("-e", "--echo", action="append", dest="input_lines", default=[])

Но если я попытаюсь запустить скрипт (python options.py -e hello world), он отобразит только ['hello']. Как мне исправить это так, чтобы он выводил ['hello', 'world']?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Немного хакерский способ сделать это:

from optparse import OptionParser

version_msg = ""
usage_msg = ""
parser = OptionParser(version=version_msg, usage=usage_msg)
parser.add_option("-e", "--echo", action="append", dest="input_lines", default=[])

options, arguments = parser.parse_args()

print(options.input_lines + arguments)

Затем я запускаю

python myscript.py -e hello world how are you

Вывод:

['hello', 'world', 'how', 'are', 'you']
0 голосов
/ 25 апреля 2018

В argparse это довольно просто, с параметром nargs:

In [245]: parser = argparse.ArgumentParser()
In [246]: parser.add_argument('-e','--echo', nargs='+');
In [247]: parser.parse_args(['-e','hello','world'])
Out[247]: Namespace(echo=['hello', 'world'])

nargs используется для указания количества строк, которые принимает действие. «+» означает один или несколько. Результаты собраны в список. Он моделирует значения nargs для использования регулярных выражений (например, '?' И '*' также работают).

In [248]: parser.print_help()
usage: ipython3 [-h] [-e ECHO [ECHO ...]]

optional arguments:
  -h, --help            show this help message and exit
  -e ECHO [ECHO ...], --echo ECHO [ECHO ...]

Глядя на документы optparse, я вижу параметр nargs, но он должен быть числом. Для переменного числа мы должны использовать callback, как описано в:

https://docs.python.org/2/library/optparse.html#callback-example-6-variable-arguments

Использование функции, определенной в этом разделе:

In [266]: parser = optparse.OptionParser()
In [267]: parser.add_option('-e','--echo', dest='echo', action='callback', callback=vararg_callback);

In [268]: parser.parse_args(['-e','hello','world'])
Out[268]: (<Values at 0x7f0ff208a5c0: {'echo': ['hello', 'world']}>, [])

В argparse, nargs='+' собирает значения вплоть до следующего -- или -, но это распределение выполняется сверху вниз с помощью основной процедуры синтаксического анализа, а не обратного вызова, определенного для самого option.

0 голосов
/ 25 апреля 2018

Я думаю, что это лучше всего сделать, заключив аргумент в кавычки, т.е. hello world становится 'hello world', это гарантирует, что опция -e потребляет всю строку.Если вам действительно нужно разбить строку на части, то есть ['hello', 'world'] вместо ['hello world'], вы можете легко вызвать split () для options.e [0]

strings = options.e[0].split()

Для более сложного метода вы можете использовать обратный вызов, приведенный ниже, ссылки на соответствующий вам пример.

https://docs.python.org/3/library/optparse.html#callback-example-6-variable-arguments

...