Python 3.8.0a3无法获得文件系统编码的Python编解码器

问题描述 投票:2回答:1

当我从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,但在运行时崩溃,并且我不知道是什么原因引起的麻烦-人们建议环境受到污染,但它一定不取决于系统的环境。我将如何自信地将应用程序发布到其他人的计算机上?我是否可能错过了一些编译标志或定义?

cpython
1个回答
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.