2012-01-27 32 views
5

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

Trả lời

1

Tôi bắt gặp một câu hỏi giống như câu hỏi của bạn. (How fo force subprocess to refresh stdout buffer?)

stdout ống chuyển hướng trên cửa sổ hoàn toàn đệm defaultly, nó có nghĩa là bạn không thể đọc bất cứ điều gì từ ống trừ khi chạy tiến trình con kết thúc hoặc gọi fflush sau printf tại subprocess.

Đây không phải là vấn đề về cửa sổ, nhưng do thiết kế và đôi khi cũng giống như vấn đề.

Và tôi havnt tìm thấy một giải pháp tốt cho câu hỏi này, cho tôi biết nếu u giải quyết nó.

+0

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

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