Câu hỏi rất cụ thể (Tôi hy vọng): Sự khác biệt giữa ba mã sau là gì?Python subprocess Popen.communicate() tương đương với Popen.stdout.read()?
(Tôi hy vọng nó sẽ được duy nhất mà là người đầu tiên không chờ đợi cho quá trình con được hoàn thành, trong khi những người thứ hai và thứ ba làm. Nhưng tôi cần phải chắc chắn đây là sự khác biệt chỉ ...)
tôi cũng hoan nghênh những nhận xét khác/gợi ý (mặc dù tôi đã nhận thức rõ về shell=True
nguy hiểm và hạn chế cross-platform)
Lưu ý rằng tôi đã đọc Python subprocess interaction, why does my process work with Popen.communicate, but not Popen.stdout.read()? và rằng tôi không muốn/cần phải tương tác với chương trình sau.
Cũng lưu ý rằng tôi đã đọc Alternatives to Python Popen.communicate() memory limitations? nhưng mà tôi không thực sự có được nó ...
Cuối cùng, lưu ý rằng Tôi biết rằng ở đâu đó có một nguy cơ bế tắc khi một bộ đệm được làm đầy với một đầu ra sử dụng một phương pháp, nhưng tôi đã bị mất trong khi tìm kiếm lời giải thích rõ ràng trên Internet ...
mã đầu tiên:
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
mã thứ hai:
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
đang Thứ ba:
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
Cảm ơn.