Domanda molto specifica (spero): Quali sono le differenze tra i seguenti tre codici?Sottoprocesso Python Popen.communicate() equivalente a Popen.stdout.read()?
(mi aspetto che sia solo il primo non attendere che il processo figlio da rifinire, mentre il secondo e il terzo fanno. Ma ho bisogno di essere sicuri che questo è l'unico differenza ...)
Accolgo con favore anche altre osservazioni/suggerimenti (anche se sono già ben consapevoli dei pericoli e limitazioni shell=True
cross-platform)
Nota che ho già letto Python subprocess interaction, why does my process work with Popen.communicate, but not Popen.stdout.read()? e che io non voglio/bisogno di interagire con il programma dopo.
Si noti inoltre che ho già letto Alternatives to Python Popen.communicate() memory limitations? ma che non ho davvero capito ...
Infine, ricordiamo che sono consapevole che da qualche parte c'è il rischio di deadlock quando un buffer viene riempito con un'uscita utilizzando un metodo, ma mi sono perso durante la ricerca di spiegazioni chiare su Internet ...
primo codice:
from subprocess import Popen, PIPE
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
secondo codice:
from subprocess import Popen, PIPE
from subprocess import communicate
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
(stdout, stderr) = process.communicate()
return process, stderr, stdout
terzo codice:
from subprocess import Popen, PIPE
from subprocess import wait
def exe_f(command='ls -l', shell=True):
"""Function to execute a command and return stuff"""
process = Popen(command, shell=shell, stdout=PIPE, stderr=PIPE)
code = process.wait()
stdout = process.stdout.read()
stderr = process.stderr.read()
return process, stderr, stdout
Grazie.