Domanda

desidero eseguire più comandi in una riga:

vale a dire. (Solo per illustrare il mio bisogno):

cmd (shell)

poi

cd dir

e

ls

e leggere il risultato del subprocess.

Qualche idea con <=> modulo?

Aggiornamento:

<=> e <=> sono solo un esempio. Ho bisogno di eseguire comandi complessi (seguendo un ordine particolare, senza alcun pipelining). In effetti, mi piacerebbe una conchiglia sottoprocesso e la possibilità di lanciare molti comandi su di esso.

È stato utile?

Soluzione

C'è un modo semplice per eseguire una sequenza di comandi.

Utilizza il seguente in subprocess.Popen

"command1; command2; command3"

In alternativa, se sei bloccato con le finestre, si hanno diverse scelte.

  • Crea un file temporaneo ".bat", e fornire questo a <=>

  • Crea una sequenza di comandi con "\ n" separatori in una sola lunga serie.

Usa "" "s, come questo.

"""
command1
command2
command3
"""

In alternativa, se si deve fare le cose frammentario, si deve fare qualcosa di simile.

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()

Che vi permetterà di costruire una sequenza di comandi.

Altri suggerimenti

Per fare questo, si dovrebbe:

  • fornire il shell=True argomento nella chiamata subprocess.Popen, e
  • separare i comandi con:
    • ; se in esecuzione in una shell * nix (bash, cenere, sh, ksh, csh, tcsh, zsh etc)
    • & se si esegue sotto la cmd.exe Windows

Alla ricerca di 'bar' in tutti i file il cui nome 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()

'out' e 'err' sono oggetti stringa contenente l'output standard e, infine, l'output di errore.

Sì, la funzione subprocess.Popen() supporta un argomento cwd parola chiave, con cui è possibile impostare la directory viene eseguito il processo in.

Credo che il primo passo, il guscio, non è necessario, se tutto quello che volete è quello di eseguire ls, non c'è bisogno di correre attraverso una shell.

Naturalmente, si potrebbe anche solo passare la directory desiderata come argomento per cd.

Aggiornamento: è opportuno notare che per i serbatoi tipici, <=> implementato nel serbatoio stesso, non è un comando esterno sul disco. Questo è perché ha bisogno di cambiare la directory corrente del processo, che deve essere fatto all'interno del processo. Poiché comandi vengono eseguiti come figlio trasformati, generato dalla shell, non possono farlo.

seguito script python avere 3 funzione di ciò che si desidera semplicemente eseguire:

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])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top