Ejecutar Comandos de forma Secuencial en Python?
-
21-08-2019 - |
Pregunta
Me gustaría ejecutar varios comandos en una fila:
es decir,(sólo para ilustrar mi necesidad):
cmd
(la concha)
entonces
cd dir
y
ls
y leer el resultado de la ls
.
Alguna idea de con subprocess
módulo?
Actualización:
cd dir
y ls
son sólo un ejemplo.Necesito ejecutar comandos complejos (siguiendo un orden determinado, sin ningún tipo de canalización).De hecho, me gustaría un subproceso de la shell y la habilidad para ejecutar muchos comandos en ella.
Solución
No es una manera fácil de ejecutar una secuencia de comandos.
Utiliza el siguiente en subprocess.Popen
"command1; command2; command3"
O, si le pegan con ventanas, tiene varias opciones.
-
Crea un archivo temporal "BAT", y proporcionar esta a <=>
-
Crea una secuencia de comandos con "\ n" separadores en una sola cadena larga.
Uso "" "s, como este.
"""
command1
command2
command3
"""
O, si tiene que hacer las cosas poco a poco, lo que tiene que hacer algo como esto.
class Command( object ):
def __init__( self, text ):
self.text = text
def execute( self ):
self.proc= subprocess.Popen( ... self.text ... )
self.proc.wait()
class CommandSequence( Command ):
def __init__( self, *steps ):
self.steps = steps
def execute( self ):
for s in self.steps:
s.execute()
Eso le permitirá construir una secuencia de comandos.
Otros consejos
Para hacer eso, usted tendría que:
- suministrar el
shell=True
argumento en la llamadasubprocess.Popen
, y - separe los comandos con:
-
;
si se ejecuta bajo un shell * nix (bash, ceniza, sh, ksh, csh, tcsh, zsh etc) -
&
si se ejecuta bajo lacmd.exe
de Ventanas
-
Búsqueda de 'bar' en todos los archivos cuyo nombre contiene 'foo':
from subprocess import Popen, PIPE
find_process = Popen(['find', '-iname', '*foo*'], stdout=PIPE)
grep_process = Popen(['xargs', 'grep', 'bar'], stdin=find_process.stdout, stdout=PIPE)
out, err = grep_process.communicate()
'hacia fuera' y 'ERR' son objetos de cadena que contienen la salida estándar y, finalmente, la salida de error.
Sí, el subprocess.Popen()
función admite un argumento cwd
palabra clave, con el que puede establecer el directorio que se ejecuta en el proceso.
Creo que el primer paso, la cáscara, no es necesario, si lo que quieres es correr ls
, no hay necesidad de correr a través de una concha.
Por supuesto, usted podría también acaba de pasar el directorio deseado como un argumento a cd
.
Actualización: podría valer la pena señalar que en los depósitos típicos, <=> se implementa en el depósito propiamente dicho, no es un comando externo en el disco. Esto se debe a que necesita para cambiar el directorio actual del proceso, que debe hacerse desde dentro del proceso. Desde comandos se ejecutan como niño procesado, generado por la carcasa, que no pueden hacer esto.
a continuación script en Python 3 tienen la función de lo que desee simplemente ejecute:
import sys
import subprocess
def cd(self,line):
proc1 = subprocess.Popen(['cd'],stdin=subprocess.PIPE)
proc1.communicate()
def ls(self,line):
proc2 = subprocess.Popen(['ls','-l'],stdin=subprocess.PIPE)
proc2.communicate()
def dir(silf,line):
proc3 = subprocess.Popen(['cd',args],stdin=subprocess.PIPE)
proc3.communicate(sys.argv[1])