2016-08-06 15 views
5

Nhu:Làm thế nào để chạy một quá trình với thời gian chờ và vẫn nhận thiết bị xuất chuẩn trong thời gian chạy

  1. Timeout sau X giây, và giết chết quá trình (và tất cả các quá trình được mở) nếu thời gian chờ đạt được trước khi quá trình này kết thúc một cách duyên dáng .
  2. Đọc kết quả liên tục khi chạy.
  3. Làm việc với các quy trình sản xuất ra sản phẩm, sản phẩm không sản xuất và sản xuất ra, sau đó ngừng sản xuất (ví dụ: bị bị kẹt).
  4. Chạy trên Windows.
  5. Chạy trên Python 3.5.2.

Mô-đun con xử lý Python 3 có timeout được xây dựng và tôi cũng đã thử và tự thực hiện thời gian chờ bằng bộ đếm thời gian và sử dụng nhưng không hoạt động với đầu ra. readline() đang chặn hay không? readlines() chắc chắn là chờ đợi cho quá trình kết thúc trước khi phun ra tất cả các đầu ra, mà không phải là những gì tôi cần (tôi cần liên tục).

Tôi gần chuyển sang Node.js :-(

+2

Sự cố với quá trình xuất chuẩn có thể đang trong quá trình con. Nếu bộ đệm stdout không được flushed thì python sẽ không bao giờ nhận được nội dung (và đó sẽ là cùng một ngôn ngữ bạn sử dụng). Một giải pháp có thể (chưa được kiểm tra) sẽ là trong 'subprocess.Popen' để gán stdout của con cho stderr. Thông thường stderr là unbuffered. – cdarke

+1

Có, 'readline' sẽ chặn, chờ để nhận dòng kế tiếp, cũng như bất kỳ thứ gì khác đọc' sys.stdin'. Bạn có thể nói với Python để làm cho 'sys.stdout' bị vô hiệu hóa bằng cách chỉ rõ tùy chọn' -u' trên dòng lệnh. –

+6

Không ai quan tâm nếu bạn chuyển sang node.js ... – martineau

Trả lời

4

Tôi sẽ sử dụng asyncio cho các loại hình công việc

đọc IO từ quá trình này như thế nào trong anwser chấp nhận điều này:. How to stream stdout/stderr from a child process using asyncio, and obtain its exit code after?

(tôi không muốn sao chép hoàn toàn nó ở đây)

Wrap nó trong một thời gian chờ:

async def killer(trans, timeout): 
    await asyncio.sleep(timeout) 
    trans.kill() 
    print ('killed!!') 

trans, *other_stuff = loop.run_until_complete(
          loop.subprocess_exec(
           SubprocessProtocol, 'py', '-3', '-c', 'import time; time.sleep(6); print("Yay!")' , 
             ) 
         ) 

asyncio.ensure_future(killer(trans, 5)) # 5 seconds timeout for the kill 
loop.run_forever() 

Vui chơi ...

+0

Thật không may, tôi không thể thực hiện quá trình này sau 5 giây bạn đã đề cập. –

+0

@NaphtaliGilead - Quá trình này không hết thời gian, nhưng cuộc gọi của bạn sẽ trở lại và sau đó bạn có thể giết nó –

+0

Đã cập nhật để hủy quá trình sau 5 giây –

0

Sử dụng 2 tập lệnh python bên dưới.

  • Các Master.py sẽ sử dụng Popen để bắt đầu một quá trình mới và sẽ bắt đầu một thread watcher rằng sẽ giết chết quá trình sau khi 3.0 giây.

  • Nô lệ phải gọi phương thức xả nếu không có dòng mới trong dữ liệu được ghi vào stdout, (trên cửa sổ '\n' cũng gây ra xả).

Cẩn thận module time không phải là một chính xác timer cao.

Thời gian tải của quá trình này có thể kéo dài hơn 3,0 giây trong trường hợp nghiêm trọng (đọc file chạy từ một ổ đĩa flash USB có 1,0)

Master.py

import subprocess, threading, time 

def watcher(proc, delay): 
    time.sleep(delay) 
    proc.kill() 

proc = subprocess.Popen('python Slave.py', stdout = subprocess.PIPE) 
threading.Thread(target = watcher, args = (proc, 3.0)).start() 

data = bytearray() 

while proc: 
    chunk = proc.stdout.read(1) 
    if not chunk: 
     break 
    data.extend(chunk) 
    print(data) 

Nô lệ.py

import time, sys 

while True: 
    time.sleep(0.1) 
    sys.stdout.write('aaaa') 
    sys.stdout.flush() 
+0

Ví dụ của bạn hoạt động, nhưng tôi không thể chạy quy trình của mình và nhận kết quả. –

+0

sử dụng đường dẫn đầy đủ đến tệp thực thi của bạn. ví dụ: 'c: \ windows \ system32 \ py.exe' 'd: \ Slave.py' –

Các vấn đề liên quan