Разделить длинные аргументы на Python аргументы командной строки - PullRequest
1 голос
/ 10 января 2020

Как разделить длинные аргументы для скрипта Python, используя argparse?

В настоящее время вам придется вызывать скрипт с аргументами, например:

python myscript.py --argument1 "Value1" --argument2 "Value2" --argument3 "Value3" --argument4 "Value4" --argument5 "Value5" --argument6 "Value6"

Однако это может быть трудно писать, особенно если у вас длинный список аргументов. Что-то вроде ниже было бы намного легче читать по моему мнению. Но когда я попробую ниже, я получаю следующую ошибку: unrecognized arguments: \

python myscript.py \
  --argument1 "Value1" \
  --argument2 "Value2" \
  --argument3 "Value3" \
  --argument4 "Value4" \
  --argument5 "Value5" \
  --argument6 "Value6"

Кто-нибудь знает, как это сделать? Или это вообще невозможно?

На случай, если это кому-нибудь понадобится; Вот пример моего кода:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--argument1')
parser.add_argument('--argument2')
parser.add_argument('--argument3')
parser.add_argument('--argument4')
parser.add_argument('--argument5')
parser.add_argument('--argument6')

args = parser.parse_args()

Ответы [ 4 ]

0 голосов
/ 10 января 2020

Это не связано с python, это зависит от вашего терминала. В bash (linux) ваша команда работает, потому что \ сообщает оболочке, что вы продолжаете команду на следующей строке. Я предполагаю, что вы используете cmd в Windows. В этом случае эквивалентный оператор - ^, поэтому просто напишите:

python myscript.py ^
  --argument1 "Value1" ^
  --argument2 "Value2" ^
  --argument3 "Value3" ^
  --argument4 "Value4" ^
  --argument5 "Value5" ^
  --argument6 "Value6"

То же самое относится и к сценариям (.sh, .cmd файлы и c). В powershell, оператор обратный удар, к вашему сведению.

0 голосов
/ 10 января 2020

Есть несколько способов сделать это.

  • Использовать файл конфигурации. Как уже говорили другие, это стандарт, потому что он чистый, привычный и простой в использовании. Python имеет ConfigParser для решения этой проблемы.

  • Есть команды, которые приводят к вызову и запросу из списка других опций. Это может быть что-то вроде:

python myscript.py
...
>>> Which of the following would you like to do?
>>>0. Do x
>>>1. Do y
>>>2. Do z
...
1
>>> Doing y, which subcommand would you like to use:
>>>0. Do a
>>>1. Do b
...

Вы можете сделать это с помощью argparse или, проще, просто с помощью input()

  • Есть флаги argparse, которые имеют подкоманды , По сути, это подразумевает скрытие некоторых команд за другими командами. Таким образом, вместо вариантов 1-> 6 у вас могут быть варианты 1a, 1b, 2a, 2b, 3a, 3b. Таким образом, вы можете ввести что-то вроде:
python myscript.py --option_2 --option_a
  • В качестве альтернативы, вы можете запустить скрипт из файла. Поместите все команды в файл, затем запустите ваш основной скрипт небольшим скриптом (пример ниже). Каждый аргумент может быть указан в отдельной строке файла. Например:
import subprocess as sp

def execute_script():
    with open('arguments.txt') as args_file:
        args = args_file.readlines()
    sp.run(f'python myscript.py {*args}')
0 голосов
/ 10 января 2020

Используйте следующие клавиши для написания многострочных команд в соответствии с вашей системой.

\ работает для Unix систем.

^ работает для Windows команды prompt.

` работает для Windows Powershell.

Таким образом, в вашем случае команду можно записать так:

Для Windows командная строка

python myscript.py ^
  --argument1 "Value1 is very very very ^
long long long string" ^
  --argument2 "Value2" ^
  --argument3 "Value3" ^
  --argument4 "Value4" ^
  --argument5 "Value5" ^
  --argument6 "Value6"

для Windows Powershell

python myscript.py `
  --argument1 "Value1 is very very very `
long long long string" `
  --argument2 "Value2" `
  --argument3 "Value3" `
  --argument4 "Value4" `
  --argument5 "Value5" `
  --argument6 "Value6"

для Unix систем

python myscript.py \
  --argument1 "Value1" \
  --argument2 "Value2" \
  --argument3 "Value3" \
  --argument4 "Value4" \
  --argument5 "Value5" \
  --argument6 "Value6"

TL; DR: Используйте ^ в windows cmd, ` в windows powershell & \ в системах Unix / Linux.

0 голосов
/ 10 января 2020

Для удобства чтения, если вы говорите, что Value1, Value2, ... очень длинные строки, вы можете сделать это.

python myscript.py \
  --argument1 "Value1 is very very very \
long long long string" \
  --argument2 "Value2" \
  --argument3 "Value3" \
  --argument4 "Value4" \
  --argument5 "Value5" \
  --argument6 "Value6"

Или вы можете назначить строку длинного аргумента сначала к переменной оболочки.

ARG1="Value1 is very very very \
long long long string"
python myscript.py \
  --argument1 "${ARG1}" \
  --argument2 "Value2" \
  --argument3 "Value3" \
  --argument4 "Value4" \
  --argument5 "Value5" \
  --argument6 "Value6"
...