2017-03-01 70 views
2

問題:使用C++嵌入Python時會引發奇怪的異常。使用C++嵌入Python

計劃:

bool embedd::execute_python(std::string location) 
{ 
    if (std::ifstream(location)) 
    { 
      const char* file_location = location.c_str(); 
      FILE* file_pointer; 
      // Initialize the Python interpreter 
      Py_Initialize(); 
      file_pointer = _Py_fopen(file_location, "r"); 
      // Run the Python file 
      PyRun_SimpleFile(file_pointer, file_location); 
      // Finalize the Python interpreter 
      Py_Finalize(); 
     return true; 
    } 
    return false; 
} 

什麼上面的代碼片斷應該做的:功能應先檢查傳入的參數是否是Python文件的有效位置。如果文件存在,那麼它應該執行Python文件。

我的預期結果是:是和否。

什麼錯誤:

測試文件1:

print("Hello world") 

結果:成功執行,並得到適當的輸出

測試文件2:

from tkinter import * 
root = Tk() 
root.mainloop() 

Result : Exception root = Tk() File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\Lib\tkinter__init__.py", line 1863, in init baseName = os.path.basename(sys.argv[0]) AttributeError: module 'sys' has no attribute 'argv'

測試過一些其他文件,發現當我們導入像tkinter,uuid,os等模塊(任何)時,會引發類似的異常。在簡要挖這個我IDE的過程監控告訴「符號文件未加載」,例如加載tk86t.dll

Python版本沒有符號文件:這一點我已經提到3.5.2

鏈接: SO - 1發現的bug已經在Python 2.3這裏BUGS

回答

2

一方面,你的測試文件2個進口Tk的這需要一個有效的命令行(例如像窗戶C:\>python script.py -yourarguments)出於某些原因固定。另一方面,你嵌入python,因此沒有命令行。這就是python的抱怨(「模塊'sys'沒有屬性'argv'」)。您應該創建一個假的命令行直接Py_Initialize後()的東西,如:

Py_Initialize(); 
wchar_t const *dummy_args[] = {L"Python", NULL}; // const is needed because literals must not be modified 
wchar_t const **argv = dummy_args; 
int    argc = sizeof(dummy_args)/sizeof(dummy_args[0])-1; 
PySys_SetArgv(argc, const_cast<wchar_t **>(argv)); // const_cast allowed, because PySys_SetArgv doesn't change argv 

您的測試文件1不導入Tk的,因此估計不會有有效的命令行。這就是沒有上述代碼的原因。

+0

謝謝你的幫助!非常感激! –