Estoy tratando de pasar una cadena de varias líneas. La cadena es un conjunto de comandos que se ejecutarán en una máquina remota.

Sé que puedo ejecutar el comando usando ssh en el módulo de subproceso, pero debido a la restricción de requisitos, tengo que pasarlo como una cadena.

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

Estoy recibiendo el siguiente error:

u'  File "<string>", line 1
    exec(\'\'\'import subprocess
                            ^
SyntaxError: EOF while scanning triple-quoted string literal
0
Umang Agrawal 4 oct. 2019 a las 09:29

3 respuestas

La mejor respuesta

Veamos en qué se convierte esto:

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

Python elimina internamente una capa de escape:

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

Esto ahora tiene una nueva línea 'en bruto', lo que significa que el shell remoto / ejecución de comando ve dos líneas y ejecutará dos comandos:

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

Me sorprende que el shell haga esto sin error, pero no obstante, el comando python recibe la siguiente cadena:

exec('''import subprocess

Esto ahora muestra de dónde viene la excepción. Para solucionarlo, solo agregue más capas de escape a la nueva línea:

"python -c \"exec('''import subprocess\\nsubprocess.Popen(\"{}\")''')\""
1
MegaIng 4 oct. 2019 a las 07:39

Cada vez, cuando hay barras en la variable, me enfrento a este tipo de errores. Veamos qué almacena tu variable.

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

Esto almacenará:

python -c "exec ('' 'subproceso de importación

Y

subprocess.Popen ("") '' '"

En dos lineas diferentes.

Debido al cambio de línea en la variable, python está creando una excepción.

Una de las soluciones que he usado es usar barras dobles:

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

Eso resolverá el problema del cambio de línea, pero a veces es confuso, cuando hay muchas barras en la cadena variable que deben almacenarse.

La segunda solución es el uso de Python Raw String: la cadena en bruto de Python se crea al prefijar un literal de cadena con ‘r 'o‘ R'. La cadena sin procesar de Python trata la barra invertida como un carácter literal.

Entonces, en lugar de contar las barras y convertirlas en barras dobles, solo tienes que hacer esto:

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

Esto almacenará la cadena como está en la variable:

python -c \"exec('''import subprocess\nsubprocess.Popen(\"ATS 2.pdf\")''')\"
1
Kathan Thakkar 4 oct. 2019 a las 08:20

Intente reemplazar \"{}\" con '{}'.

0
andole 4 oct. 2019 a las 06:40
58231017