español - Ejecutar comandos secuencialmente en Python
subprocess python 3 example (5)
Para hacer eso, tendrías que:
- suministrar el
shell=True
argumentoshell=True
en elsubprocess.Popen
llamada, y - separe los comandos con:
-
;
si se ejecuta bajo un shell * nix (bash, ash, sh, ksh, csh, tcsh, zsh, etc.) -
&
si se ejecuta bajo elcmd.exe
de Windows
-
Me gustaría ejecutar varios comandos en una fila:
es decir (solo para ilustrar mi necesidad):
cmd (el caparazón)
entonces
cd dir
y
ls
y lea el resultado de la ls.
¿Alguna idea con el módulo de subproceso?
ACTUALIZAR:
cd dir y ls son solo un ejemplo. Necesito ejecutar comandos complejos (siguiendo un orden particular, sin ningún tipo de canalización). De hecho, me gustaría un shell de subproceso y la capacidad de ejecutar muchos comandos en él.
Encontrar ''barra'' en cada archivo cuyo nombre contenga ''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()
''out'' y ''err'' son objetos de cadena que contienen la salida estándar y, eventualmente, la salida de error.
Hay una manera fácil de ejecutar una secuencia de comandos.
Use lo siguiente en el subprocess.Popen
"command1; command2; command3"
O bien, si está atascado con Windows, tiene varias opciones.
Cree un archivo temporal ".BAT" y proporciónelo al
subprocess.Popen
Cree una secuencia de comandos con separadores "/ n" en una sola cadena larga.
Use "" "s, como este.
"""
command1
command2
command3
"""
O bien, si debe hacer cosas por partes, debe 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 te permitirá construir una secuencia de comandos.
Sí, la función subprocess.Popen ()
admite un argumento de palabra clave cwd
, con el que puede establecer el directorio donde ejecuta el proceso.
Supongo que el primer paso, el shell, no es necesario, si todo lo que quieres es ejecutar ls
, no hay necesidad de ejecutarlo a través de un shell.
Por supuesto, también podría pasar el directorio deseado como argumento para ls
.
Actualización: podría valer la pena señalar que para los shells típicos, el cd
se implementa en el propio shell, no es un comando externo en el disco. Esto se debe a que necesita cambiar el directorio actual del proceso, lo cual debe hacerse desde dentro del proceso. Como los comandos se ejecutan como secundarios procesados, generados por el shell, no pueden hacer esto.
debajo de la secuencia de comandos de python tiene 3 funciones lo que acaba de ejecutar solo:
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])