2009-06-17 31 views
8

Tôi đang cố gắng để khởi động một quá trình con và nhận được kết quả của nó trên Linux từ Python sử dụng mô-đun subprocess:Popen.communicate() throws OSError: "[Errno 10] Không có tiến trình con"

#!/usr/bin/python2.4 
import subprocess 

p = subprocess.Popen(['ls', '-l', '/etc'], 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
out, err = p.communicate() 

Tuy nhiên, tôi gặp phải một số lỗi: đôi khi, p.communicate() sẽ ném

OSError: [Errno 10] No child processes 

Điều gì có thể gây ra ngoại lệ này? Có bất kỳ tình trạng không xác định hay điều kiện chủng tộc nào ở đây có thể gây ra tình trạng không ổn định?

+0

Bạn đang sử dụng phiên bản python nào? Nó hoạt động tốt cho tôi nếu tôi đưa ra 'extra_args' – sqram

Trả lời

3

Bạn có thể chạy vào các lỗi đề cập ở đây: http://bugs.python.org/issue1731717

+1

Nếu nó là lỗi này xem xét việc cập nhật python của bạn đến 2.5/2.6. Nó đã được giải quyết. – kjfletch

+2

Tính đến 2010-09-29 lỗi vẫn được đánh dấu là "mở/cần vá" và ảnh hưởng đến phiên bản 3.2, 3.1, 2.7, 2.6. – fotinakis

0

Tôi không thể tái sản xuất này trên Python của tôi (2.4.6-1ubuntu3). Làm thế nào bạn đang chạy kịch bản của bạn? Tần suất này xảy ra như thế nào?

0

Tôi đã gặp phải vấn đề này khi sử dụng Python 2.6.4 mà tôi đã xây dựng vào thư mục chính của mình (vì tôi không muốn nâng cấp "được xây dựng trong" Python trên máy).

Tôi đã làm việc xung quanh nó bằng cách thay thế subprocess.Popen() bằng (không được chấp nhận) os.popen3().

6

Bạn có chặn SIGCHLD trong tập lệnh không? Nếu bạn là sau đó Popen sẽ không chạy như mong đợi vì nó dựa trên xử lý riêng của nó cho tín hiệu đó.

Bạn có thể kiểm tra xử lý SIGCHLD bằng cách bình luận ra các cuộc gọi Popen và sau đó chạy:

strace python <your_script.py> | grep SIGCHLD 

nếu bạn nhìn thấy một cái gì đó tương tự như:

rt_sigaction(SIGCHLD, ...) 

sau đó, bạn đang gặp rắc rối. Bạn cần vô hiệu hóa trình xử lý trước khi gọi Popen và sau đó đặt lại nó sau khi giao tiếp được thực hiện (điều này có thể giới thiệu một điều kiện chủng tộc để hãy cẩn thận).

signal.signal(SIGCHLD, handler) 
... 
signal.signal(SIGCHLD, signal.SIG_DFL) 
''' 
now you can go wild with Popen. 
WARNING!!! during this time no signals will be delivered to handler 
''' 
... 
signal.signal(SIGCHLD, handler) 

Có một lỗi python báo cáo về vấn đề này và như xa như tôi nhìn thấy nó chưa được giải quyết chưa:

http://bugs.python.org/issue9127

Hy vọng rằng sẽ giúp.

+0

Xin chào http://bugs.python.org/issue9127 đã truy cập liên kết nhưng không thể tìm ra trong đó việc phát hành python vấn đề được khắc phục. Bạn có thể giúp tôi như vậy không. –

+0

Dưới đây là danh sách các bản phát hành giải quyết các vấn đề này http://bugs.python.org/issue1731717#msg260457 –

+0

Thông báo và liên kết được chia sẻ ở trên dường như không chính xác, vì theo các phiên bản mà lỗi được gửi Python 3.1, Python 3.2, Python 2.7, Python 2.6 các phiên bản Python này được đề cập trong đó lỗi được tìm thấy. –

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