desde - Ejecutar comandos de Bash en Python
modulo subprocess python (6)
Es posible utilizar el programa bash, con el parámetro -c para ejecutar los comandos:
bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
output = subprocess.check_output([''bash'',''-c'', bashCommand])
En mi máquina local, ejecuto un script python que contiene esta línea
bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)
Esto funciona bien
Luego ejecuto el mismo código en un servidor y aparece el siguiente mensaje de error
''import site'' failed; use -v for traceback
Traceback (most recent call last):
File "/usr/bin/cwm", line 48, in <module>
from swap import diag
ImportError: No module named swap
Entonces, lo que hice entonces es insertar un "print bashCommand" que me imprime el comando en el terminal antes de ejecutarlo con os.system ().
Por supuesto, recibo nuevamente el error (causado por os.system (bashCommand)) pero antes de ese error imprime el comando en la terminal. Luego copié esa salida e hice una copia pegada en la terminal y presioné enter y funciona ...
¿Alguien tiene una pista de lo que está pasando :(?
La forma pitónica de hacer esto es usar un subprocess.Popen
Popen
subprocess.Popen
toma una lista donde el primer elemento es el comando que se ejecutará seguido de cualquier argumento de línea de comando.
Como ejemplo:
import subprocess
args = [''echo'', ''Hello!'']
subprocess.Popen(args) // same as running `echo Hello!` on cmd line
args2 = [''echo'', ''-v'', ''"Hello Again"'']
subprocess.Popen(args2) // same as running ''echo -v "Hello Again!"` on cmd line
Llamarlo con subproceso
import subprocess
subprocess.Popen("cwm --rdf test.rdf --ntriples > test.nt")
Parece que el error que está recibiendo se debe a que no hay un módulo de intercambio en el servidor, debe instalar el intercambio en el servidor y luego ejecutar de nuevo el script
No use os.system
. Ha quedado en desuso en favor del subprocess . De los docs : "Este módulo tiene la intención de reemplazar varios módulos y funciones anteriores: os.system
, os.spawn
".
Como en tu caso:
bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
import subprocess
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
Puede usar ''subproceso'', pero siempre sentí que no era una manera ''pitthonic'' de hacerlo. Así que creé Sultan (plug sin vergüenza) que hace que sea fácil ejecutar funciones de línea de comandos.
Según el error, falta un paquete llamado swap en el servidor. Esto /usr/bin/cwm
requiere. Si está en Ubuntu / Debian, instale python-swap
usando aptitude.