Ошибка EOF в трехстрочных кавычках - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь передать многострочную строку. Строка - это набор команд, которые должны быть выполнены на удаленном компьютере.

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

    some_variable = "python -c \"exec('''import subprocess\nsubprocess.Popen(\"{}\")''')\"".format(file_path)
    execute_cmd_on_remote(some_variable)

Я получаю следующую ошибку:

u'  File "<string>", line 1
    exec(\'\'\'import subprocess
                            ^
SyntaxError: EOF while scanning triple-quoted string literal

Ответы [ 3 ]

1 голос
/ 04 октября 2019

Посмотрим, во что это превратится:

"python -c \"exec('''import subprocess\nsubprocess.Popen(\"{}\")''')\""

Python внутренне удаляет один escape-слой:

python -c "exec('''import subprocess
subprocess.Popen("<file_path>")'''"

Теперь у него есть «необработанный» символ новой строки, означающий, что удаленная оболочка /cmd-executeer видит две строки и выполняет две команды:

  • python -c "exec('''import subprocess
  • subprocess.open("<file_path>")'''

Я удивлен, что оболочка делает этобез ошибок, но, тем не менее, python -команда получает следующую строку:

exec('''import subprocess

Теперь это показывает, откуда происходит исключение. Чтобы исправить это, просто добавьте несколько слоев перехода на новую строку:

"python -c \"exec('''import subprocess\\nsubprocess.Popen(\"{}\")''')\""
0 голосов
/ 04 октября 2019

Каждый раз, когда в переменной есть косые черты, я сталкиваюсь с такого рода ошибками. Посмотрим, что хранит ваша переменная.

some_variable = "python -c \" exec ('' 'подпроцесс импорта \ nsubprocess.Popen (\ "{} \")' '') \"" .format (file_path)

Это будет хранить:

python -c "exec ('' 'импортный подпроцесс

и

subprocess.Popen ("") '' '"

в двух разных строках.

Из-за изменения строки в переменной pythonсоздает исключение.

Одно из решений, которое я использовал, использует двойные слэши:

 "python -c \"exec('''import subprocess\\nsubprocess.Popen(\"{}\")''')\""

Это решит проблему изменения строки, но иногда это сбивает с толку, когдав строке переменной, которая должна быть сохранена, есть много косых черт.

Вторым решением является использование строки Python Raw: строка Python raw создается путем добавления префикса строкового литерала к 'r' или 'R.' Python rawСтрока обрабатывает обратную косую черту как буквальный символ.

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

some_variable = r"python -c \"exec('''import subprocess\nsubprocess.Popen(\"{}\")''')\"".format(filepath)

Будет сохранена строка в том виде, в котором она находится в переменной:

python -c \"exec('''import subprocess\nsubprocess.Popen(\"ATS 2.pdf\")''')\"
0 голосов
/ 04 октября 2019

Попробуйте заменить \"{}\" на '{}'.

...