Класс shlex
обеспечивает совместимость с анализом, выполняемым обычными терминальными оболочками Unix, такими как bash, dash и sh.
Чтобы воспользоваться этой совместимостью, укажите аргумент punctuation_chars
в конструкторе. По умолчанию используется значение False
, которое сохраняет поведение до Python-3.6. Если аргумент punctuation_chars
установлен в True, то анализ символов (); | &
меняется: любое появление этих символов возвращается как один токен.
Хотя это не специфичный анализатор команд для оболочек bash, dash и sh, он позволяет выполнять обработку командных строк очень легко.
>>> import shlex >>> cmd = "a && b; c && d || e; f >'abc'; (def \"ghi\")" >>> sh = shlex.shlex(cmd, posix=True) >>> sh.whitespace_split = True >>> list(s) # ['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)'] >>> sh = shlex.shlex(cmd, posix=True, punctuation_chars=True) >>> sh.whitespace_split = True >>> list(sh) # ['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';', # '(', 'def', 'ghi', ')']
Конечно, будут возвращены токены, которые недопустимы для оболочек, и вам нужно будет выполнить собственные проверки ошибок на возвращенных токенах.
Вместо передачи True
в качестве значения параметра punctuation_chars
, можно передать строку с конкретными символами, которая будет использоваться для определения того, какие символы представляют собой знаки препинания.
>>> import shlex >>> s = shlex.shlex("a && b || c", punctuation_chars="|") >>> list(s) # ['a', '&', '&', 'b', '||', 'c']
Примечание. Если указано значение аргумента punctuation_chars
, атрибут sh.wordchars
дополняется символами ~-./*?=
. Это связано с тем, что эти символы могут появляться в именах файлов, включая символы подстановки и аргументах командной строки, например --color=auto).
Следовательно:
>>> import shlex >>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?', ... punctuation_chars=True) >>> list(s) # ['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']
Тем не менее, чтобы максимально приблизиться к анализу, который проводит терминальная оболочка, рекомендуется всегда использовать режим POSIX и sh.whitespace_split
при использовании аргумента punctuation_chars
, что полностью отрицает sh.wordchars
.
Для лучшего эффекта, punctuation_chars
должны быть установлены вместе с posix=True
. Обратите внимание, что до Python-3.6 аргумент posix=False
в модуле shlex
является значением по умолчанию.
.