Come eseguire i comandi shell in Python usando il metodo di esecuzione del sottoprocess

Come eseguire i comandi shell in Python usando il metodo di esecuzione del sottoprocess
Il sottoprocesso è un modulo Python integrato che può essere utilizzato per creare nuovi processi e interagire con i loro flussi di dati di input e output. In termini più semplici, puoi usarlo per eseguire comandi shell ed eseguire binari eseguibili di solito sparsi in varie cartelle "bin" su un file system Linux. È inoltre possibile fornire un percorso completo a un binario eseguibile e utilizzare tutti gli switch della riga di comando associati al binario. Questo articolo spiegherà come utilizzare il modulo del sottoprocessa e il suo metodo di corsa nelle app Python. Tutti i campioni di codice nell'articolo sono testati con Python 3.8.2 su Ubuntu 20.04.

Il sottoprocesso.METODO METODO

Il sottoprocesso.Il metodo esegui prende un elenco di argomenti. Quando viene chiamato il metodo, esegue il comando e attende che il processo finisca, restituendo un oggetto "completato" alla fine. L'oggetto "CompletedProcess" restituisce STDOUT, STDERR, argomenti originali utilizzati durante la chiamata del metodo e un codice di ritorno. STDOUT si riferisce al flusso di dati prodotto dal comando, mentre Stderr si riferisce a eventuali errori raccolti durante l'esecuzione del programma. Qualsiasi codice di ritorno diverso da zero (codice di uscita) significherebbe un errore con il comando eseguito nel sottoprocesso.METODO METODO.

Esempio 1: contenuto di output di un file di testo usando il sottoprocesso.METODO METODO

Il comando seguente emetterà il contenuto di un "dati.file txt ", supponendo che contenga una stringa" name = John ".

Sottoprocesso di importazione
sottoprocesso.Esegui (["Cat", dati.TXT"])

L'esecuzione del codice sopra restituirà il seguente output:

nome = John
CompletedProcess (Args = ['Cat', 'Data.txt '], returncode = 0)

Il primo elemento dell'argomento dell'elenco è il nome del comando da eseguire. Qualsiasi elemento nell'elenco che segue il primo elemento sono considerati opzioni o switch della riga di comando. È possibile utilizzare anche singoli trattini e doppi trattini per definire le opzioni. Ad esempio, per elencare file e cartelle in una directory, il codice sarebbe "sottoprocesso.Run (["LS", "-l"] ". Nella maggior parte di questi casi, è possibile considerare qualsiasi argomento separato nello spazio in un comando shell come singolo elemento nell'elenco fornito al sottoprocesso.METODO METODO.

Esempio 2: sopprimere l'output del sottoprocesso.METODO METODO

Per sopprimere l'output del sottoprocesso.METODO DI ESEGGIO, dovrai fornire “stdout = sottoprocess.Devnull "e" stderr = sottoprocesso.Devnull "come argomenti aggiuntivi.

Sottoprocesso di importazione
sottoprocesso.Esegui (["Cat", dati.txt "], stdout = sottoprocess.Devnull,
Stderr = sottoprocesso.Devnull)

L'esecuzione del codice sopra produrrà il seguente output:

CompletedProcess (Args = ['Cat', 'Data.txt '], returncode = 0)

Esempio 3: output di acquisizione del sottoprocesso.METODO METODO

Per catturare l'output del sottoprocesso.Metodo Esegui, usa un argomento aggiuntivo chiamato "Capture_Output = true".

Sottoprocesso di importazione
output = sottoprocesso.Esegui (["Cat", dati.txt "], cauture_output = true)
Stampa (output)

L'esecuzione del codice sopra produrrà il seguente output:

CompletedProcess (Args = ['Cat', 'Data.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

È possibile accedere singolarmente ai valori STDOUT e STDERR utilizzando "Output.stdout "e" output.Metodi Stderr ". L'uscita viene prodotta come una sequenza di byte. Per ottenere una stringa come output, usa “Output.stdout.Decodifica ("UTF-8") ". Puoi anche fornire "testo = vero" come argomento extra al sottoprocesso.Esegui chiamata per ottenere l'output in formato stringa. Per ottenere il codice di stato di uscita, è possibile utilizzare l'output.Metodo di ritorno ”.

Esempio 4: sollevare l'eccezione sull'errore del comando eseguito dal sottoprocesso.METODO METODO

Per sollevare un'eccezione quando il comando esce con uno stato diverso da zero, usa l'argomento "Check = true".

Sottoprocesso di importazione
sottoprocesso.Esegui (["Cat", dati.tx "], cauture_output = true, text = true, check = true)

L'esecuzione del codice sopra produrrà il seguente output:

Raccolta chiamataprocesserror (retCode, processo.args,
sottoprocesso.Chiamatiprocesserror: comando '[' cat ',' dati.TX ']'
Restituito lo stato di uscita diverso da zero 1.

Esempio 5: passare una stringa al comando eseguito dal sottoprocesso.METODO METODO

È possibile passare una stringa al comando per essere eseguita dal sottoprocesso.Esegui metodo usando l'argomento "input = 'string'".

Sottoprocesso di importazione
output = sottoprocesso.Esegui (["Cat"], Input = "Dati.txt ", cauture_output = true,
text = true, controlla = true)
Stampa (output)

L'esecuzione del codice sopra produrrà il seguente output:

CompletedProcess (args = ['cat'], returnCode = 0, stDout = 'Data.txt ', stderr = ")

Come puoi vedere, il codice sopra passa "dati.txt ”come stringa e non come oggetto file. Per passare "dati.txt "come file, usa l'argomento" stdin ".

con aperto ("Dati.txt ") come f:
output = sottoprocesso.run (["cat"], stdin = f, cauture_output = true,
text = true, controlla = true)
Stampa (output)

L'esecuzione del codice sopra produrrà il seguente output:

CompletedProcess (args = ['cat'], returnCode = 0, stDout = 'name = John \ n', stderr = ")

Esempio 6: eseguire il comando direttamente nella shell usando il sottoprocesso.METODO METODO

È possibile eseguire un comando direttamente in una shell "come è", invece di usare una stringa divisa nel comando principale e le opzioni che lo seguono. Per fare questo, devi passare "shell = true" come ulteriore argomento. Ciò è tuttavia scoraggiato dagli sviluppatori di Python in quanto l'uso di "shell = true" può portare a problemi di sicurezza. Puoi leggere di più sulle implicazioni di sicurezza da qui.

Sottoprocesso di importazione
sottoprocesso.Esegui ("Dati Cat".txt '", shell = true)

L'esecuzione del codice sopra produrrà il seguente output:

nome = John

Conclusione

Il sottoprocesso.Esegui il metodo in Python è piuttosto potente, in quanto consente di eseguire comandi shell all'interno di Python stesso. Questo aiuta a limitare tutto il codice a Python stesso senza la necessità di avere un codice di script shell aggiuntivo in file separati. Può essere, tuttavia, piuttosto difficile tokenizzare correttamente i comandi della shell in un elenco di Python. Puoi usare lo "Shlex.Metodo split () "per tokenizzare i comandi di shell semplici, ma in comandi lunghi e complessi - in particolare quelli con simboli del tubo - Shlex non riesce a dividere correttamente il comando. In tali casi, il debug può essere un problema difficile. Puoi usare l'argomento "shell = true" per evitarlo, ma ci sono alcuni problemi di sicurezza associati a questa azione.