2012-12-12 22 views
7

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:

  1. trực tiếp tại nhà ga
  2. python script sử dụng os.system
  3. 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 
+0

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ố –

+0

' subprocess.call() 'chỉ là' subprocess.Popen (* popenargs, ** kwargs) .wait() '. – Blender

+0

@ 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. –

Trả lời

8

Mã dưới đây dựa trên nhận xét tuyệt vời J.F. Sebastian đã thực hiện. Mã dưới đây chạy trong 0,1 giây như mong đợi và trả về đầu ra của lệnh tới một chuỗi.

from subprocess import check_call, STDOUT 
from tempfile import NamedTemporaryFile 

with NamedTemporaryFile() as f: 
    check_call(['/etc/init.d/networking', 'restart'], stdout=f, stderr=STDOUT) 
    f.seek(0) 
    output = f.read() 
Các vấn đề liên quan