Bardzo konkretne pytanie (mam nadzieję): Jakie są różnice między następującymi trzema kodami?Podproces Pythona Popen.communicate() jest odpowiednikiem Popen.stdout.read()?
(I oczekiwać, że będzie tylko, że pierwszy nie czekać na proces potomny się skończył, natomiast drugie i trzecie z nich robić. Ale muszę być pewien, że to tylko różnica ...)
Cieszę się również inne uwagi/sugestie (choć jestem już sobie sprawę z niebezpieczeństw i ograniczeń shell=True
cross-platform)
pamiętać, że już czytać Python subprocess interaction, why does my process work with Popen.communicate, but not Popen.stdout.read()? i że nie chcą/muszą współdziałać z programem po.
Należy również pamiętać, że już czytać Alternatives to Python Popen.communicate() memory limitations? ale ja naprawdę nie rozumiem ...
Wreszcie należy pamiętać, że zdaję sobie sprawę, że gdzieś tam jest ryzyko zakleszczenia, gdy jeden bufor jest wypełniona jednym wyjściem przy użyciu jednej metody, ale zgubiłem patrząc na jasnych wyjaśnień w Internecie ...
Pierwszy kod:
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
Drugi kod:
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
kod trzecie:
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
Dzięki.