example español python windows subprocess

español - Ejecutar comandos secuencialmente en Python



subprocess python 3 example (5)

Para hacer eso, tendrías que:

  • suministrar el shell=True argumento shell=True en el subprocess.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 el cmd.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])