2016-04-24 99 views
0

我試圖將Pyhton3程序嵌入到C++中。以下幾個教程和博客文章後,我得到了下面的代碼,這將失敗:嵌入式Python3在導入本地模塊時引發異常

Py_SetProgramName(_program_name); 
Py_Initialize(); 

PyObject* main = PyImport_AddModule("__main__"); 
PyObject* globalDictionary = PyModule_GetDict(main); 
PyObject* localDictionary = PyDict_New(); 
//create the dictionaries as shown above 
PyObject* pythonpath = PySys_GetObject("path"); 
if (PyList_Append(pythonpath, PyBytes_FromString("/path/to/my/modules")) == -1) 
{ 
    std::cerr << "Failed to append to python path" << std::endl; 
    PyErr_Print(); 
} 
const char* pythonScript = "" 
"import sys\n" 
"print('Hello')\n" 
"import options\n" 
"print('World')\n" 
""; 
PyObject* returnValue = PyRun_String(pythonScript, Py_file_input, globalDictionary, localDictionary); 
if (!returnValue) 
{ 
    std::cerr << "python raised an exception" << std::endl; 
    PyErr_Print(); 
    return 1; 
} 

結果如下:

Hello 
python raised an exception 
Traceback (most recent call last): 
    File "<string>", line 5, in <module> 
    File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 2222, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 2164, in _find_spec 
    File "<frozen importlib._bootstrap>", line 1940, in find_spec 
    File "<frozen importlib._bootstrap>", line 1914, in _get_spec 
    File "<frozen importlib._bootstrap>", line 2049, in find_spec 
    File "<frozen importlib._bootstrap>", line 53, in _path_join 
    File "<frozen importlib._bootstrap>", line 53, in <listcomp> 
TypeError: 'str' does not support the buffer interface 

因此,進口SYS的作品,但在導入我自己的模塊發生故障,同時加入我的模塊的路徑似乎工作。

有什麼想法?

回答

0

替換PyBytes_FromString通過PyUnicode_DecodeFSDefault使導入工作。我不明白爲什麼。