2012-03-02 94 views
4

我寫了一個嵌入Python的小型C程序。我使用Py_Initialize()和Py_Finalize()正確設置它,並且可以使用PyRun_SimpleString或PyRun_SimpleFile運行腳本。但是,我不知道如何在打印變量時模仿Python自己的解釋器的行爲。在嵌入式Python解釋器中打印變量

具體來說:

a = (1, 2, 3) 
print a 

工作正常,我:它打印出(1,2,3)

然而:

a = (1, 2, 3) 
a 

打印出什麼都沒有。在Python自己的解釋器中,這也會打印出(1,2,3)。我怎樣才能使我的代碼做用戶期望的事情並打印出價值?

在此先感謝!

+0

然後你需要模擬解釋器。只需逐行評估輸入,然後「打印」結果。 – 2012-03-02 22:40:13

回答

7

要運行解釋器交互循環,您應該使用函數PyRun_InteractiveLoop()。否則,你的代碼的行爲就好像它是用Python腳本文件寫的,而不是交互式輸入。

編輯:這裏有一個簡單的交互式解釋的全碼:

#include <Python.h> 

int main() 
{ 
    Py_Initialize(); 
    PyRun_InteractiveLoop(stdin, "<stdin>"); 
    Py_Finalize(); 
} 

EDIT2:實現GUI的全交互式解釋是有點項目。可能最簡單的方法是編寫一個連接到僞終端設備的基本終端仿真器,並在該設備上使用上述代碼。這會自動獲得所有的細節。

如果您的目標不是全面的交互式編輯器,則可以使用PyRun_String()Py_single_input作爲開始令牌。這將允許您像在交互式解釋器中那樣運行一些Python代碼,並且如果該代碼恰好是一個不計算爲None的單個表達式,那麼它的值的表示形式將被打印出來 - 當然還有stdout。下面是一些示例代碼(無簡單錯誤檢查):

#include <Python.h> 

int main() 
{ 
    PyObject *main, *d; 
    Py_Initialize(); 
    main = PyImport_AddModule("__main__"); 
    d = PyModule_GetDict(main); 
    PyRun_String("a = (1, 2, 3)", Py_single_input, d, d); 
    PyRun_String("a", Py_single_input, d, d); 
    Py_Finalize(); 
} 

這將打印(1, 2, 3)

仍然有很多問題:

  • 沒有錯誤處理和追溯打印。
  • 對於交互式解釋器中的塊命令,沒有「增量輸入」。輸入需要完整。
  • 輸出到標準輸出。
  • 如果給出多行輸入,則不會打印任何內容。

要真正複製交互式解釋器的行爲並不容易。這就是爲什麼我最初的建議是在GUI中編寫一個基本的終端模擬器,這不應該太難 - 或者甚至有一個可用。

+0

是的,我試過這個,但它似乎想要一個交互式輸入 - 除非我做錯了什麼。我試過的是: FILE * myfile = fopen(「example.py」,「r +」); PyRun_InteractiveLoop(myfile,「example.py」); fclose(myfile); – FizzBuzz 2012-03-02 22:54:04

+0

@FizzBu​​zz:所以你想從文件中讀取命令,但希望它們的行爲就像是交互式輸入的一樣?你聲稱這是你的用戶期望的?我確定我在這裏錯過了一些東西。 – 2012-03-02 23:01:20

+0

@FizzBu​​zz:請注意,您傳遞給'PyRun_InteractiveLoop()'的文件必須「與交互式設備關聯」,如鏈接文檔所述。 – 2012-03-02 23:02:49