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.

¿Fue útil?

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 llamada subprocess.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 la cmd.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])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top