gpt4 book ai didi

cpython - Python 3.8.0a3 获取文件系统编码的Python编解码器失败

转载 作者:行者123 更新时间:2023-12-05 07:23:56 25 4
gpt4 key购买 nike

当我从我的 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 或将环境变量 PYTHONPATHPYTHONHOME 设置为 "" 或 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);
}

关于cpython - Python 3.8.0a3 获取文件系统编码的Python编解码器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com