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 importazionesottoprocesso.run(["gatto", "dati.TXT"])
L'esecuzione del codice sopra restituirà il seguente output:
nome=GiovanniCompletedProcess(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 importazionesottoprocesso.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 importazioneoutput = 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 importazionesottoprocesso.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 importazioneoutput = 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 importazionesottoprocesso.run("dati di gatto.txt'", shell=True)
L'esecuzione del codice sopra produrrà il seguente output:
nome=GiovanniConclusione
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.