当我从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,但随后在运行时崩溃,我也不知道是什么原因引起的麻烦-人们建议环境受到污染,但不能依赖于系统的环境环境。我将如何自信地将应用程序发布到其他人的计算机上?我是否可能错过了一些编译标志或定义?
答案 0 :(得分:0)
我确定你是,但是您是在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);
}
答案 1 :(得分:0)
现在看来有点老了,但是看起来需要将包括所有python系统文件的Lib文件夹添加到应用程序的搜索路径。
看看这个UWP的Python端口
它具有包含编解码器文件的嵌入式python34app.zip。