espaƱol ejecutar desde compilar comandos abrir python bash

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.

https://github.com/aeroxis/sultan


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.