2012-08-10 51 views
7

在Python中,以下代碼片段將在執行時打開交互式shell。Python:code.interact(local = locals())其中stdin/stdout不可用

import code; code.interact(local = locals())

這已被證明非常有用的調試相當多的代碼是很少記錄。人們可以使用shell來瀏覽程序內環境並找出發生了什麼,即使沒有調試器。到現在爲止還挺好。

現在的挑戰。

我正在使用的軟件(用Django寫的)使用某種調度機制,然後對話另一個 Python進程,除了編輯代碼之外,我無法控制它。除了發送給它進行處理的變量之外,我沒有任何輸入。

但是,我不知道代碼如何工作,因爲文檔非常差,所以我想用code.interact方法來解決問題。

但是這個過程是由一些特殊的調度軟件在背景的某個地方開始的,所以流程不會從Django應用程序轉移到我希望檢查的部分。相反,信號和對象被髮送,然後在任意時間(10-200ms之間的任何時間)以完全不同的過程運行。當接收到信號和對象時,標準輸出/標準輸出完全不在畫面中。

所以我想通過指定readfunc參數來代替使用stdin/stdout來與code.interact通信,我可以使用文件句柄或Unix套接字。我試過這個open() ing文件和套接字,但無濟於事。

現在我試圖讓它僅僅從Django進程本身開始工作,所以即使調度問題不存在問題,並且交互式shell真的開始時,它立即關閉,既不接受帶有命令的文件作爲內容,也不是Python命令管道的Unix套接字。

長話短說;是否可以通過除stdin/stdout以外的其他方式與code.interact調用的交互式shell進行通信?如果是這樣,怎麼樣?

在此先感謝。

回答

4

我並沒有完全遵循有關調度器和Django等等。

但要回答你的問題的核心:

#!/usr/bin/python 

import code 

f = open('input.txt', 'r') 

def readfunc(prompt): 
    return f.readline() 

code.interact(readfunc=readfunc) 

然後運行在一個終端:

$ ./test.py 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 

通知你沒有得到提示。

然後在另一個終端運行:

echo "globals()" >> input.txt 

而早在第一終端,你會看到輸出。

相關問題