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
3 respuestas
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(\"{}\")''')\""
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\")''')\"
Intente reemplazar \"{}\"
con '{}'
.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.