2013-06-17 58 views
9

tôi đẻ trứng một quá trình con như thế này:Force Node.js để tuôn viết cho con xử lý

var child = require('child_process'); 
var proc = child.spawn('python', ['my_script.py', '-p', 'example']); 

Tôi cũng thiết lập một số xử lý dữ liệu:

proc.stdin.setEncoding('utf8'); 
proc.stdout.setEncoding('utf8'); 
proc.stderr.setEncoding('utf8'); 

proc.stdout.on('data', function (data) { 
    console.log('out: ' + data); 
}); 

proc.stderr.on('data', function (data) { 
    console.log('err: ' + data); 
}); 

proc.on('close', function (code) { 
    console.log('subprocess exited with status ' + code); 
    proc.stdin.end(); 
}); 

My Python script đọc dòng từ stdin và cho mỗi dòng thực hiện một số thao tác và in tới stdout. Nó hoạt động tốt trong vỏ (Tôi viết một dòng và tôi nhận được đầu ra ngay lập tức) nhưng khi tôi làm điều này trong Node:

for (var i = 0; i < 10; i++) { 
    proc.stdin.write('THIS IS A TEST\n'); 
} 

Tôi không nhận được gì.

Tôi đã sửa lỗi gọi proc.stdin.end() nhưng điều đó cũng chấm dứt quá trình con (mà tôi muốn ở chế độ nền, dữ liệu phát trực tiếp).

Tôi cũng kích hoạt quá trình làm đầy bộ đệm bằng nhiều lần ghi, nhưng đó không thực sự là một tùy chọn.

Có cách nào để xóa luồng thủ công không?

+0

Nếu 'write()' trả về true thì nó đã bị xóa. Nếu nó trả về false, bạn có thể nghe sự kiện ''drain'' để kiểm tra khi bộ đệm ghi đã được xóa hoàn toàn. Bạn đang nói rằng bạn có thể viết dữ liệu, và nó không bao giờ bị đỏ mặt? Tôi nghi ngờ rằng quá trình con đang chunking dữ liệu và tìm kiếm một cái gì đó khác hơn là '\ n' để phá vỡ các đầu vào. Khi bạn tràn bộ đệm đầu vào của nó hoặc kết thúc luồng, đứa trẻ buộc phải xử lý dữ liệu tại thời điểm đó. –

+0

@BretCopeland yup, 'write()' trả về 'true'. Tôi nghĩ có lẽ nó không phải là viết được xếp hàng đợi ... nhưng có lẽ là đọc? Thật kỳ lạ, nhưng tôi chắc chắn rằng các trẻ em không chunking dữ liệu vì nó hoạt động trong trình bao, và tôi có thể xác minh nó đang tìm kiếm '\ n'. Chạy kịch bản và chỉ viết các dòng và nhấn enter hoạt động như mong đợi (dữ liệu được ghi vào stdout khi nhập được nhấn và quá trình không thoát). Tôi thực sự bị mắc kẹt ở đây. – kaoD

+1

Cùng một vấn đề ở đây bạn thân. grep sinh sản không bao giờ kết quả đầu ra. – kilianc

Trả lời

2

Bạn không xóa đầu ra khỏi Python sau câu lệnh in. Tôi có vấn đề tương tự và @Alfe trả lời câu hỏi của tôi. Hãy xem điều này:

Stream child process output in flowing mode

+0

Rất tiếc, tôi đã hủy mã nên tôi không thể kiểm tra xem nó có giải quyết được sự cố hay không. Cảm ơn câu trả lời! – kaoD