当我从c ++应用程序调用嵌入式python时,应用程序崩溃。 _PyCodec_Lookup
中的某些内容不起作用。调试似乎表明错误来自文件codecs.c
中的此行:
PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
goto onError;
[interp->codec_search_path
为NULL,_PyCodecRegistry_Init()
返回-1。
此问题是已知的;删除python27或将环境变量PYTHONPATH
或PYTHONHOME
设置为""
或src路径等解决方案均无效。
我链接到cpython版本3.8.0a3,该版本已使用包含在PCBUILD文件夹中的脚本进行编译,使用与我的应用程序相同的编译器(MSVC 15 2017)。
操作系统是Windows 8.1 64位。
我的应用程序成功链接到生成的二进制python38.dll / python38.lib,但在运行时崩溃,并且我不知道是什么原因引起的麻烦-人们建议环境受到污染,但它一定不取决于系统的环境。我将如何自信地将应用程序发布到其他人的计算机上?我是否可能错过了一些编译标志或定义?
我确定你是,但是你在Py_Initialize之后执行此操作吗?
我包含python3.8 dll,但是在启动时我将可执行文件完全路径,然后将其添加到python路径(以下代码未经测试,但这大概是我的工作)
void py_add_to_path (const char *path)
{
PyObject *py_cur_path, *py_item;
char *new_path;
int wc_len, i;
wchar_t *wc_new_path;
char *item;
new_path = strdup(path);
py_cur_path = PySys_GetObject("path");
for (i = 0; i < PyList_Size(py_cur_path); i++) {
char *tmp = strappend(new_path, PATHSEP);
myfree(new_path);
new_path = tmp;
py_item = PyList_GetItem(py_cur_path, i);
if (!PyUnicode_Check(py_item)) {
continue;
}
item = py_obj_to_str(py_item);
if (!item) {
continue;
}
tmp = strappend(new_path, item);
free(new_path);
new_path = tmp;
free(item);
}
/* Convert to wide chars. */
wc_len = sizeof(wchar_t) * (strlen(new_path) + 1);
wc_new_path = (wchar_t *) malloc(wc_len, "wchar str");
mbstowcs(wc_new_path, new_path, wc_len);
PySys_SetPath(wc_new_path);
}