Python optparse и пробелы в аргументе

при использовании optparse я хочу получить всю строку после опции, но я получаю только часть ее до первого пробела.

например:

python myprog.py --executable python someOtherProg.py

то, что я получаю в "исполняемом", - это просто "python".

можно ли анализировать такие строки с помощью optparse или для этого нужно использовать argparse?

€: Я уже пытался заключить его в "s. Но после дальнейшего копания в коде я обнаружил, что вызов подпроцесса не может обрабатывать аргумент.

строка с командной строкой запихивается в список "args".

args = [self.getExecutable()] + self.getArgs().split()

это как

"[python D:\workspace\myprog\src\myprog.py]"

это дает мне, что система не может найти исключение файла. Когда я использую

args[0]

это работает. Но я передаю аргументы исполняемому файлу.

модуль подпроцесса строит cmdline из списка, если он не получает строку в первую очередь, поэтому я не могу объяснить это поведение на данный момент.

5 ответов


вы можете заключать их в кавычки, чтобы заставить их работать с существующим кодом.

python myprog.py --executable "python someOtherProg.py"

можно ли анализировать такие строки с помощью optparse или для этого нужно использовать argparse?

Я не знаю, если/как вы можете сделать это с помощью optparse как я на самом деле не работал с optparse.

Я могу, однако, помочь вам с argparse. Вот краткий пример:

#!/usr/bin/python
import argparse, sys

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.')
    parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables')
    args = parser.parse_args(sys.argv[1:])
    print args.executable

и использование:

manoj@maruti:~$ python myprog.py --executable python someOtherProg.py
['python', 'someOtherProg.py']

Я бы тоже рекомендуем переключиться с optparse to argparse. Optparse и устаревший С 2.7.


Я нашел еще одну хорошую альтернативу shlex - класс лексического анализатора для простых синтаксисов, подобных оболочке.

ссылка на источник: как анализировать командную строку с регулярными выражениями?

>>> import shlex
>>> shlex.split('"param 1" param2 "param 3"')
['param 1', 'param2', 'param 3']
>>> shlex.split('"param 1" param2 "param 3"')
Traceback (most recent call last):
    [...]
ValueError: No closing quotation
>>> shlex.split('"param 1" param2 "param 3\""')
['param 1', 'param2', 'param 3"']

поведение, которое вы видите, происходит от того, что это ваша оболочка, а не python, которая анализирует командную строку и разделяет ее на слова sys.аргв. Python запускается оболочкой через exec () с уже заполненным argv.

большинство оболочек будут разбивать элементы argv на пробелы, если вы не скажете им не цитировать или экранировать.

котировки работают, как описано выше.

во многих оболочках вы можете сделать это:

python myprog.py --executable python\ someOtherProg.py

обратная косая черта убегает следующий пробел без кавычек.


если вы знаете, сколько слов после флага аргумент вы собираетесь получить, вы можете изменить способ создания --executable опция В in optparse правильно справиться с ситуацией:

взяв один слово после флага опции вы можете установить optparse парсер для поиска два (или более) слова:
from optparse import OptionParser
parser = OptionParser()

parser.add_option("-f", "--file", action="store", dest="filename",
                       help="File to be processed.", metavar="FILE")
parser.add_option("-e", "--executable", action="store", dest="my_exe",
                       help="Command to be executed", metavar="EXE",
                       nargs=2)

в этом фрагменте -f или --file опция ожидает только одно слово и сохраняет его как строку ( по умолчанию) в filename переменной.

напротив -e, ожидает два слова из-за . Это приведет к двум словам, найденным за -e или --executable флаг для хранения в виде строк в списке Python my_exe.

проверить: http://docs.python.org/library/optparse.html подробнее о optparse, и помните, что он был осужден с 2.7 в пользу argparse.


просто завершить этот список ответов, если вы не можете обновить до argparse.

Optparse не в состоянии справиться с этими ситуациями (несколько строк). Вы можете использовать только nargs для указания определенного количества valiables, но нет ничего похожего на"один или несколько". Вы нужно взломать или использовать другую библиотеку (например, argparse или другие).