Pitone

Come eseguire i comandi della shell in Python utilizzando il metodo di esecuzione dei sottoprocessi

Come eseguire i comandi della shell in Python utilizzando il metodo di esecuzione dei sottoprocessi
Subprocess è 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 di shell ed eseguire binari eseguibili solitamente sparsi in varie cartelle "bin" in un file system Linux. Puoi anche fornire un percorso completo a un binario eseguibile e utilizzare qualsiasi opzione della riga di comando associata al binario. Questo articolo spiegherà come utilizzare il modulo subprocess e il suo metodo di esecuzione nelle app Python. Tutti gli esempi di codice nell'articolo sono testati con Python 3.8.2 su Ubuntu 20.04.

Il sottoprocesso.eseguire il metodo

Il sottoprocesso.run accetta un elenco di argomenti. Quando il metodo viene chiamato, esegue il comando e attende il completamento del processo, restituendo alla fine un oggetto “CompletedProcess”. L'oggetto "CompletedProcess" restituisce stdout, stderr, gli 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 generati 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 di esecuzione.

Esempio 1: contenuto di output di un file di testo utilizzando il processo secondario.eseguire il metodo

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

sottoprocesso di importazione
sottoprocesso.run(["gatto", "dati.TXT"])

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

nome=Giovanni
CompletedProcess(args=['cat', 'data.txt'], codice di ritorno=0)

Il primo elemento dell'argomento della lista è il nome del comando da eseguire. Qualsiasi elemento nell'elenco che segue il primo elemento è considerato opzioni o opzioni della riga di comando. Puoi anche usare trattini singoli e doppi per definire le opzioni. Ad esempio, per elencare file e cartelle in una directory, il codice sarebbe "subprocess.run([“ls”, “-l”]”. Nella maggior parte di questi casi, puoi considerare qualsiasi argomento separato da spazi in un comando di shell come un singolo elemento nell'elenco fornito al sottoprocesso.metodo di esecuzione.

Esempio 2: sopprimere l'output del processo secondario.eseguire il metodo

Per sopprimere l'output del sottoprocesso.run, dovrai fornire "stdout=subprocess.DEVNULL” e “stderr=subprocess.DEVNULL" come argomenti aggiuntivi.

sottoprocesso di importazione
sottoprocesso.run(["gatto", "dati.txt"], stdout=subprocess.DEVNULL,
stderr=sottoprocesso.DEVNULL)

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

CompletedProcess(args=['cat', 'data.txt'], codice di ritorno=0)

Esempio 3: Cattura l'output del sottoprocesso.eseguire il metodo

Per catturare l'output del sottoprocesso.run, usa un argomento aggiuntivo chiamato "capture_output=True".

sottoprocesso di importazione
output = sottoprocesso.run(["gatto", "dati.txt"], capture_output=Vero)
stampa (uscita)

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

CompletedProcess(args=['cat', 'data.txt'], codice di ritorno=0,
stdout=b'name=John\n', stderr=b")

Puoi accedere individualmente ai valori stdout e stderr usando "output.stdout” e “output.metodi "stderr". L'output viene prodotto come una sequenza di byte. Per ottenere una stringa come output, usa "output.stdout.metodo di decodifica ("utf-8")". Puoi anche fornire "text=True" come argomento extra al sottoprocesso.esegui la chiamata per ottenere l'output in formato stringa. Per ottenere il codice di stato di uscita, puoi utilizzare "output.metodo del codice di ritorno”.

Esempio 4: sollevare l'eccezione in caso di errore del comando eseguito dal processo secondario.eseguire il metodo

Per sollevare un'eccezione quando il comando termina con uno stato diverso da zero, utilizzare l'argomento "check=True".

sottoprocesso di importazione
sottoprocesso.run(["gatto", "dati.tx"], capture_output=True, text=True, check=True)

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

sollevare CalledProcessError(retcode, process.argomenti,
sottoprocesso.CalledProcessError: comando '['cat', 'data.tx']'
ha restituito uno stato di uscita diverso da zero 1.

Esempio 5: passare una stringa al comando eseguito dal sottoprocesso.eseguire il metodo

Puoi passare una stringa al comando da eseguire dal sottoprocesso.run utilizzando l'argomento "input='string'".

sottoprocesso di importazione
output = sottoprocesso.run(["gatto"], input="dati.txt", cattura_output=Vero,
text=Vero, spunta=Vero)
stampa (uscita)

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 "data.txt" come stringa e non come oggetto file. Per passare “dati.txt" come file, usa l'argomento "stdin".

con open("dati.txt") come f:
output = sottoprocesso.run(["cat"], stdin=f, capture_output=True,
text=Vero, spunta=Vero)
stampa (uscita)

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 utilizzando il processo secondario.eseguire il metodo

È possibile eseguire un comando direttamente in una shell "così com'è", invece di utilizzare una stringa divisa nel comando principale e nelle opzioni che lo seguono. Per fare ciò, devi passare "shell=True" come argomento aggiuntivo. Questo è tuttavia scoraggiato dagli sviluppatori Python poiché l'uso di "shell=True" può portare a problemi di sicurezza. Puoi leggere di più sulle implicazioni per la sicurezza da qui.

sottoprocesso di importazione
sottoprocesso.run("dati di gatto.txt'", shell=True)

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

nome=Giovanni

Conclusione

Il sottoprocesso.run in Python è piuttosto potente, in quanto ti consente di eseguire comandi di shell all'interno di Python stesso. Questo aiuta a limitare tutto il codice a python stesso senza la necessità di avere codice di script della shell aggiuntivo in file separati. Tuttavia, può essere piuttosto complicato tokenizzare correttamente i comandi della shell in un elenco Python. Puoi usare il "shlex.split()" per tokenizzare semplici comandi di shell, ma in comandi lunghi e complessi, specialmente quelli con simboli pipe, shlex non riesce a dividere correttamente il comando. In questi casi, il debug può essere un problema complicato. Puoi usare l'argomento "shell=True" per evitarlo, ma ci sono alcuni problemi di sicurezza associati a questa azione.

Tutorial OpenTTD
OpenTTD è uno dei giochi di simulazione aziendale più popolari in circolazione. In questo gioco, devi creare una meravigliosa attività di trasporto. T...
SuperTuxKart per Linux
SuperTuxKart è un fantastico titolo progettato per offrirti l'esperienza di Mario Kart gratuitamente sul tuo sistema Linux. È piuttosto impegnativo e ...
Tutorial Battaglia per Wesnoth
The Battle for Wesnoth è uno dei giochi di strategia open source più popolari a cui puoi giocare in questo momento. Non solo questo gioco è in svilupp...