2012-09-20 37 views
2

我正在用C++編寫Python終端GUI。我使用以下代碼來運行用戶鍵入的Python命令行:PyRun_String在發生任何錯誤後停止向stdout發送結果

void RunTerminalCommand (char * line) 
{ 

    PyObject *py_main, *py_dict; 
    py_main = PyImport_AddModule("__main__"); 
    py_dict = PyModule_GetDict(py_main); 
    PyObject * PyRes = PyRun_String(line, Py_single_input, py_dict, py_dict); 

    return 0; 
} 

它工作得非常好,與正在執行的命令行和正在打印的stdout經由在輸出窗口上的結果。但每當Python的命令行導致Python的錯誤,它停止工作:我的標準輸出沒有接收到任何數據

注:

  • 柴堆總是返回NULL,錯誤行注入

    甚至在
  • 我不知道我是否應該每次調用PyImport_AddModule。但它似乎以這種方式工作。

  • 如果我使用PyRun_SimpleString(線) insted的PyRun_String(線,Py_single_input,py_dict,py_dict)的,它總是工作,我仍然可以通過標準輸出/標準錯誤的錯誤消息。但是這個調用不會將命令行評估的結果發送到標準輸出,所以我不想使用它。例如,當我使用PyRun_String時,命令行「2 + 2」將在stdout上打印「4」,但在使用PyRun_SimpleString時不會。

回答

3

我已經經歷了類似的問題,並解決它通過添加一個「\ n」使用Py_Run_SimpleString用戶命令行之後(回車符),如示例:

PyRun_String(line, Py_single_input, py_dict, py_dict); 
PyRun_SimpleString("\n"); 

如果添加了「\ n」它不工作在PyRun_String的末尾。它需要是一個單獨的調用PyRun_SimpleString

0

首先有這樣的PyImport_AddModule文檔中:

首先檢查模塊字典,如果有一個人也沒有,如果沒有,創建一個新的,並在模塊字典插入。返回NULL,並在失敗時設置異常。

您不檢查模塊是否已經在字典中。

在文檔PyRun_String有這樣的:

返回執行該代碼作爲一個Python對象,或NULL,如果一個異常升高的結果。

你永遠不會檢查它是否成功。

還有一些其他的東西在代碼中缺失。我認爲重點是,你去閱讀文檔,並確保你瞭解它說什麼,並編寫檢查錯誤條件等所需的代碼...

+3

我沒有發佈完整的代碼,所以這可能導致你認爲我沒有檢查PyRun_String的返回。我做了,它總是返回NULL,正如我在問題中所說的那樣。但抱歉沒有發佈完整的代碼。我嘗試簡化問題並將其縮小到更少的代碼行。 – Alex

相關問題