2013-05-04 68 views
1

我寫了一個簡單的調試程序,可以執行控制檯程序並將其輸出發送到「out」和「err」文件,並從「in」文件中檢索其輸入。現在,我想擴展它的功能來運行Python腳本。爲了做到這一點,我想我可以讓調試器運行Python解釋器,並且僅僅通過文件來連接Python解釋器。重定向Python解釋器的IO

但是當我在調試器中運行Python解釋器時,我看不到任何像普通程序那樣的輸出。調試器有非常詳細的錯誤日誌記錄,並且在錯誤日誌文件中沒有看到任何錯誤。

我使用了「ps -A」,它確實出現了調試器已經啓動了Python解釋器,原因有兩個:1)進程ID不同1和2)調試器一旦我終止-9 python解釋器(它告訴文件描述符已連接)。這裏的PS - 所有的輸出:

1 R  0 1565  1 88 80 0 - 1040 -  pts/0 00:01:45 debugger 
0 S  0 1566 1565 0 80 0 - 7782 pipe_w pts/0 00:00:00 python.out 

並啓動調試器像這樣(python.out是Python解釋器的副本):

debugger python.out 

所以我想我的問題是,不任何人都知道爲什麼這不起作用? Python解釋器是否對其標準文件描述符做了奇怪的事情?

編輯:

  • 我還注意到,使用python.out不能重定向其IO python.out> out_file - 其可以或可以不與調試器具有的問題。

  • 調試器不使用塊緩衝。

  • 下面是一些IO信息的/ proc/PID/IO:

調試器(我寫了一些數據,長度爲21,進入 「中的」 文件)

rchar: 21 
wchar: 21 
syscr: 300222462 
syscw: 1 
read_bytes: 0 
write_bytes: 0 
cancelled_write_bytes: 0 

的Python解釋

rchar: 517268 
wchar: 0 
syscr: 93 
syscw: 0 
read_bytes: 0 
write_bytes: 0 
cancelled_write_bytes: 0 
+0

什麼是_「一個標準的.out程序」_,以及如何將其IO重定向到文件中?當然,輸入來自'.in'文件?或者你是否在開發流,將它發送到'.in'和python進程? – Eric 2013-05-05 00:06:17

+0

標準.out程序,在這種情況下,它是一個使用IO的std文件描述符的程序。我會編輯我的問題,以更準確地回答您的問題。 – tay10r 2013-05-05 00:19:56

+0

什麼是python.out? – 2013-05-05 00:33:30

回答

2

Python解釋器的pipe_w等待狀態是贈品:它不能因爲運行它要麼嘗試從空管道讀取,要麼寫入完整的管道。

在您的代碼或解釋器中或兩者中都使用了塊緩衝,並且您沒有向我們展示足夠的信息來告訴它們。

新增迴應評論:

你以爲你是不會阻止的緩衝,但不知道你的stdio庫可能會做它。考慮簡單:

main() 
{ 
    puts("print ('hello, world!')\n"); 
    sleep(3600); 
} 

當您從一個終端運行它,它打印在終端上print ('hello, world!'),然後睡了一個小時,完全按照你的期望。這是因爲stdio庫檢測到stdout是一個終端,並在每個換行符上執行其緩衝區的write()。它是這樣做的,因爲人們在準備就緒時會喜歡看到行緩衝輸出。但是,如果您將此程序的輸出傳送到python,則終端上一小時內不會顯示任何內容;這是因爲stdio庫看到stdout是一個管道並切換到阻塞緩衝模式。在塊緩衝模式下,stdio將等待,直到它有BUFSIZ個字符寫入,並且在現代機器上BUFSIZ爲4096或更大。

當您說「我可以確認調試器正在讀取我傳遞給它的輸入」時,由於stdio的這種模式切換,您在終端上測試調試器實際上不會告訴您有關進程間通信被緩衝或不緩衝。 ps的輸出表明它是緩衝的。請參閱setvbuf瞭解如何控制緩衝區。

或者你可以顯示你的代碼而不是無用的/proc/n/io。我python報道:

rchar: 288789 
wchar: 0 
syscr: 108 
syscw: 0 
read_bytes: 0 
write_bytes: 0 
cancelled_write_bytes: 0 

,但它仍然沒有給出任何輸出之前,不會在小時就到了,因爲它的/proc/n/wchan

pipe_wait 

預期。

+0

我的代碼不使用塊緩衝。我可以確認調試器正在讀取我傳遞給它的輸入。有沒有一種方法可以確認解釋者正在閱讀該信息?或者,有沒有辦法檢查解釋器是否使用塊緩衝? – tay10r 2013-05-05 01:15:20

+0

@TaylorFlores見上面增加。 – msw 2013-05-05 11:41:16

+0

好吧,我不得不重寫一些調試器,因爲setvbuf只適用於FILE結構體(我使用整數)。感謝您的答覆。即使我沒有測試過它,我會認爲它是一個答案,因爲無論如何,你似乎都是對的。 – tay10r 2013-05-07 01:16:01