要運行解釋器交互循環,您應該使用函數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中編寫一個基本的終端模擬器,這不應該太難 - 或者甚至有一個可用。
然後你需要模擬解釋器。只需逐行評估輸入,然後「打印」結果。 – 2012-03-02 22:40:13