Eseguire comandi in sequenza in Python?
-
21-08-2019 - |
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.
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 chiamatasubprocess.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 lacmd.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])