Tôi đang cố gắng hiểu tại sao điều này lại xảy ra. Tôi đang gọi một lệnh để khởi động lại mạng trên máy chủ Ubuntu 12.04.Kiểm tra tiến trình con của Python chậm hơn nhiều rồi gọi
thi công nhanh
Khi tôi gọi là lệnh sử dụng một trong những sau ba cách phải mất khoảng 0,1 giây để thực hiện:
- trực tiếp tại nhà ga
- python script sử dụng
os.system
- tập lệnh python sử dụng
subprocess.call
phiên cuối:
[email protected]:~# time /etc/init.d/networking restart
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.105s
[email protected]:~# time python -c "import os;
> os.system('/etc/init.d/networking restart')"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.111s
[email protected]:~# time python -c "import subprocess;
> subprocess.call(['/etc/init.d/networking', 'restart'])"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m0.111s
Chậm thực hiện
Tuy nhiên nếu tôi sử dụng subprocess.check_output
hoặc Popen và cố gắng và đọc kết quả phải mất 23 giây. Cách chậm hơn. Có vẻ như sự khác biệt đáng kể này chỉ xảy ra khi tôi thử và sử dụng một hàm sẽ trả về kết quả của lệnh. Tôi muốn hiểu lý do tại sao điều này xảy ra và tìm một giải pháp để thực hiện lệnh này và nhận được đầu ra của nó mà không mất quá nhiều thời gian.
thiết bị đầu cuối phiên:
[email protected]:~# time python -c "import subprocess;
> print subprocess.check_output(['/etc/init.d/networking', 'restart'])"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.201s
[email protected]:~# time python -c "from subprocess import Popen, PIPE;
> print Popen(['/etc/init.d/networking', 'restart'], stdout=PIPE).stdout.read()"
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.201s
Cập nhật
Một trong những ý kiến đề nghị cố gắng ra lệnh tee. Kết quả rất thú vị. Trong thiết bị đầu cuối mà không có bất kỳ sự tham gia của python nếu tee được sử dụng phải mất cùng 23 giây. Tôi vẫn còn tò mò tại sao nhưng ít nhất điều này có thể cung cấp cho nhiều hơn một đầu mối như những gì đang xảy ra.
[email protected]:~# time /etc/init.d/networking restart | tee out.txt
* Running /etc/init.d/networking restart
* Reconfiguring network interfaces...
real 0m23.181s
Tôi không biết một trong những điều sau có liên quan hay không ([câu hỏi # 10150368] (http://stackoverflow.com/questions/10150368/why-is-piping-output-of-subprocess-so -unreliable-with-python), [câu hỏi # 4940607] (http://stackoverflow.com/questions/4940607/python-subprocesses-experience-mysterious-delay-in-receiving-stdin-eof)) nhưng một câu trả lời gợi ý thêm 'close_fds = True' để bật tham số –
' subprocess.call() 'chỉ là' subprocess.Popen (* popenargs, ** kwargs) .wait() '. – Blender
@ jwpat7 cảm ơn các liên kết. Tôi đã thử close_fds = True nó đã không tạo ra sự khác biệt. –