2009-10-21 37 views
6

Tôi đang viết một chương trình python mà lauches một tiến trình con (sử dụng Popen). Tôi đang đọc tiêu chuẩn của quy trình con, thực hiện một số lọc và viết cho stdout của quy trình chính.giết subprocess khi quá trình python bị giết?

Khi tôi giết quá trình chính (cntl-C), tiến trình con vẫn tiếp tục chạy. Làm cách nào để tôi cũng xóa quy trình con? Các subprocess là likey để chạy một thời gian dài.

Bối cảnh: Tôi chỉ khởi chạy một quy trình con tại một thời điểm, tôi sẽ lọc chế độ phụ. Người dùng có thể quyết định gián đoạn để thử cái gì khác.

Tôi mới dùng python và tôi đang sử dụng các cửa sổ, vì vậy hãy nhẹ nhàng.

Trả lời

5

Windows không có tín hiệu, vì vậy bạn không thể sử dụng mô-đun tín hiệu. Tuy nhiên, bạn vẫn có thể bắt ngoại lệ KeyboardInterrupt khi nhấn Ctrl-C.

Something như thế này sẽ giúp bạn đi:

import subprocess 

try: 
    child = subprocess.Popen(blah) 
    child.wait() 

except KeyboardInterrupt: 
    child.terminate() 
+2

Một cảnh báo từ các tài liệu python trên Popen.wait(): Cảnh báo này sẽ bế tắc nếu quá trình con tạo ra đủ sản lượng để một stdout hoặc stderr ống như vậy mà nó chờ đợi khối cho bộ đệm ống hệ điều hành để chấp nhận nhiều dữ liệu hơn. Sử dụng giao tiếp() để tránh điều đó. –

+1

Thực ra 'signal.signal (signal.SIGINT, handlerFunc)' hoạt động tốt trên Python 2.6.5 (r265: 79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] trên win32 ; Tôi vừa thử nó. – RobM

0

đối tượng subprocess.Popen đi kèm với một kill và một phương pháp chấm dứt (khác ở chỗ đó là dấu hiệu bạn gửi đến quá trình này).

signal.signal cho phép bạn cài đặt trình xử lý tín hiệu, trong đó bạn có thể gọi phương thức giết của trẻ.

0

Bạn có thể sử dụng mô-đun python atexit.

Ví dụ:

import atexit 

def killSubprocess(): 
    mySubprocess.kill() 

atexit.register(killSubprocess) 
Các vấn đề liên quan