tôi có một chương trình máy chủ chạy dài (ví dụ, chương trình A) được viết bằng QT/C++. chương trình không ổn định vì vậy tôi quyết định viết một kịch bản python để khởi động lại nó nếu nó bị treo. vấn đề là chương trình có thể bắt đầu thất bại (nếu tôi đã cho nó một cổng sử dụng), in lỗi và sau đó chỉ treo ở đó mà không bỏ, vì vậy tôi phải theo dõi stdout của chương trình và giết nó khi khởi động không thành công.windows console chương trình stdout được đệm khi sử dụng chuyển hướng ống
đây là một đoạn mã cuối cùng của tôi (cũng, trên thực tế đây là ok, bạn có thể chỉ cần bỏ qua nó):
self.subp = subprocess.Popen(
r'.\A.exe -server %d' % portnum,
stdout=subprocess.PIPE, bufsize=1)
for line in iter(self.subp.stdout.readline, ''):
print(line, end='')
nhưng tôi thấy tôi không thể đọc được bất cứ điều gì từ stdout subprocess, những readline phương pháp chỉ là chặn ở đó, và nếu tôi giết quá trình A, kịch bản python chỉ cần thoát mà không có bất kỳ đầu ra. lúc đầu, tôi nghĩ rằng đó là một vấn đề của mô-đun subprocess, nhưng sau khi một số thử nghiệm tôi thấy nó không phải. nếu tôi thay thế dòng lệnh A.exe bằng một số chương trình điều khiển cửa sổ khác, ping -t chẳng hạn, mọi thứ hoạt động chính xác. vì vậy tôi nghĩ rằng đó có thể là vấn đề của chương trình A.
may mắn, tôi có mã nguồn của A, đây là một mảnh đối phó với sản lượng:
printf("Server is starting on port %u\n", Config.ServerPort);
if(server->listen())
printf("Starting successfully\n");
else
printf("Starting failed!\n");
sau khi một số tìm kiếm tôi thêm fflush(stdout);
đến cuối đoạn mã này, xây dựng lại các chương trình, và bây giờ nó hoạt động
vì vậy vấn đề của tôi là tôi vẫn không thể hiểu được, điều gì sai với mã chương trình gốc? mà không cần cưỡng bức tuôn ra, nó có thể in chính xác các chuỗi đó trong một cửa sổ giao diện điều khiển, ngay lập tức sau khi chương trình bắt đầu. tại sao đầu ra được đệm khi sử dụng đường ống trên đầu ra của nó? tôi đọc rằng trong tiêu chuẩn c thực hiện, đầu ra sẽ được đỏ tự động trên dòng mới, nhưng tại sao không trong tình hình của tôi? đây có phải là vấn đề về cửa sổ hay vấn đề về trình biên dịch không?
chương trình A được biên soạn với QT/C++, phiên bản QT là 4.7.4 (x32), trình biên dịch C++ là ming32 g ++ đi kèm với QT (GCC 4.4.0), tất cả các thử nghiệm trên nền tảng win7x64 và phiên bản python của tôi là 2.7.2
tôi nghĩ [liên kết có liên quan] (http://stackoverflow.com/q/20503671/4279) trong nhận xét trong liên kết của bạn giải thích nhiều, cảm ơn – adamhj