Как принять аргументы командной строки, заканчивающиеся на обратную косую черту
Здесь баботированное приложение Python, которое просто печатает аргументы командной строки, переданные в:
import sys
if __name__ == "__main__":
print "Arguments:"
for i in range(len(sys.argv)):
print "[%s] = %s" % (i, sys.argv[i])
А вот несколько прогонов пробега:
python args.py hello world
Arguments:
[0] = args.py
[1] = hello
[2] = world
python args.py "hello world"
Arguments:
[0] = args.py
[1] = hello world
python args.py "hello\world"
Arguments:
[0] = args.py
[1] = hello\world
Пока все хорошо. Но теперь, когда я заканчиваю любой аргумент обратной косой чертой, Python задыхается от него:
python args.py "hello\world\"
Arguments:
[0] = args.py
[1] = hello\world"
python args.py "hello\" world "any cpu"
Arguments:
[0] = args.py
[1] = hello" world any
[2] = cpu
Мне известно о неправильном строчном строении Python с использованием префикса "r" (link), и кажется очевидным, что он применяет здесь одно и то же поведение.
Но в этом случае я не могу контролировать, какие аргументы переданы мне, и я не могу обеспечить, чтобы аргументы не заканчивались обратным слэшем. Как я могу обойти это разочарование?
-
Изменить: Спасибо тем, кто указал, что это поведение не относится к Python. По-видимому, это стандартное поведение оболочки (по крайней мере, в Windows, на данный момент у меня нет Mac).
Обновленный вопрос: Как я могу принять аргументы, заканчивающиеся на обратную косую черту? Например, одним из аргументов моего приложения является путь к файлу. Я не могу обеспечить, чтобы клиент отправил его мне без обратной обратной косой черты или с обратным слэшем. Это возможно в любом случае?
Ответы
Ответ 1
Обратная косая черта в конце интерпретируется как начало escape-последовательности, в данном случае буквенный символ двойной кавычки. У меня была аналогичная проблема с параметрами среды обработки, содержащими путь, который иногда заканчивался на \, а иногда и нет.
Решение, которое я придумал, заключалось в том, чтобы всегда вставлять пробел в конец строки пути при вызове исполняемого файла. Затем мой исполняемый файл использует путь к каталогу с косой чертой и пробел в конце, который игнорируется. Вы могли бы обрезать путь внутри программы, если это вызывает проблемы.
Если% SlashPath% = "hello \"
python args.py "%SlashPath% " world "any cpu"
Arguments:
[0] = args.py
[1] = hello\
[2] = world
[3] = any cpu
Если% SlashPath% = "привет"
python args.py "%SlashPath% " world "any cpu"
Arguments:
[0] = args.py
[1] = hello
[2] = world
[3] = any cpu
Надеюсь, это даст вам некоторые идеи о том, как обойти вашу проблему.
Ответ 2
Вероятно, оболочка обрабатывает \
как escape-символ и, таким образом, избегает символа. Итак, оболочка отправляет \"
как "
(потому что думает, что вы пытаетесь избежать двойной кавычки). Решение состоит в том, чтобы избежать escape-символа, например: $ python args.py "hello\world\\"
.
Ответ 3
Правила анализа параметров Microsoft
Это правила для разбора командной строки, переданной CreateProcess(), в программу, написанную на C/С++:
- Параметры всегда разделяются
пробел или вкладка (несколько пробелов/вкладок
OK)
- Если параметр не содержит
любые пробелы, вкладки или двойные кавычки,
то все символы в
параметр принимается как есть (там
нет необходимости заключать параметр
в двойных кавычках).
- Закройте пробелы и вкладки в двойном
цитированная часть
- Двойная кавычка может быть в любом месте
в пределах параметра
- 2n обратные слэши, за которыми следует "
производить n обратную косую черту + начало/конец
двойная кавычка
- 2n + 1 обратная косая черта, за которой следует "
производить n обратную косую черту + литерал
кавычка
- n обратная косая черта, за которой не следует
кавычки производят n обратных косых черт
- Если происходит закрытие "сразу другой", второй"
принимается буквально и добавляется к
параметр (Это
недокументированное правило.)
Подробное и четкое описание см. в http://www.daviddeley.com/autohotkey/parameters/parameters.htm#WINCRULESDOC
Ответ 4
Обратная косая черта "ускользает" после этого символа. Это означает, что закрывающие кавычки становятся частью аргумента и фактически не завершают строку.
Это поведение используемой оболочки (предположительно bash или аналогичной), а не Python (хотя вы также можете избежать символов в строках Python).
Решение состоит в том, чтобы избежать обратных косых черт:
python args.py "hello\world\\"
Теперь ваш Python script должен функционировать так, как вы ожидаете.
Ответ 5
Обратная косая черта (\
) ускользает от "
. Все это. Это , как предполагается работать.
Ответ 6
Если это в Windows, вы не используете стандартную командную строку Windows (или оболочку). Это должно быть bash. Командная строка Windows не рассматривает обратную косую черту как escape-символ (поскольку это разделитель пути файла).
Дополнительная мелочь: символ цитирования в командных командах Windows имеет значение: ^
Ответ 7
Когда пользователь передает вашей функции строку "hello", независимо от того, что было на самом деле, они отправили фактическое имя строки hello ", точно так же, как если пользователь передал путь к файлу, такой как" temp\table ", что они действительно набрали, преднамеренно или нет, является" временным" (вкладка посередине).
При этом решение этой проблемы означает, что если пользователь вводит "temp\table" и, честно говоря, означает "temp able", вы собираетесь обработать это в "temp\table", и теперь вы программно уничтожены вход пользователя.
С учетом этого предупреждения, если вы все еще хотите это сделать, вы можете найти строковое представление этих экранированных символов и заменить их. Как очень простой пример, что-то вроде этого:
def allow_tabs(str_w_tab):
str_w_tab.replace('\t','\\t')
print str_w_tab
Теперь, если вы хотите обрабатывать все остальные escape-символы, вам нужно будет сделать что-то подобное для каждого. Что касается возможности сделать это для примера: "привет", пользователь передал вам строку приветствия ", и были ли они предназначены или нет, они никогда не закрывали двойную кавычку, так что это то, что видит ваша программа.