You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python C API导入NLTK报circular import循环导入错误如何解决?

问题根因

你遇到的循环导入报错核心是C代码中sys.path配置错误:

  • 路径串存在无效空格:/home/txqcusr /.local/lib/python3.8中间的空格会导致该路径完全失效
  • 路径优先级配置错误:你将/home/txqcusr/.local/lib/python3.8/site-packages/nltk直接加入sys.path,且优先级高于标准库路径/usr/lib/python3.8。nltk包内部自带一个collections.py文件,当标准库functools模块尝试导入标准库的collections模块时,会优先命中nltk目录下的collections.py,而该文件本身又需要从标准库collections导入Counter等类,直接触发循环导入。

你在Python命令行中可以正常导入nltk,是因为原生Python的sys.path默认优先级是标准库>第三方包,不会出现模块被覆盖的问题。

修复方案

方案1(更安全,推荐)

不直接全量覆盖sys.path,仅追加你需要的第三方包路径,保留Python默认的模块搜索优先级,替换原有PySys_SetPath逻辑即可:

#define PY_SSIZE_T_CLEAN
#include <Python.h>

int Lib_Gutenberg(char* module_name)
{
    PyObject *pName, *pModule;
    Py_Initialize();
    // 保留默认sys.path配置,仅追加第三方包路径
    PyObject *sys_mod = PyImport_ImportModule("sys");
    PyObject *sys_path = PyObject_GetAttrString(sys_mod, "path");
    PyList_Append(sys_path, PyUnicode_FromString("/home/txqcusr/.local/lib/python3.8/site-packages"));
    Py_DECREF(sys_path);
    Py_DECREF(sys_mod);

    pName = PyUnicode_DecodeFSDefault(module_name);
    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule == NULL){
        PyErr_Print();
        return 1;
    }
    Py_DECREF(pModule);
    return 0;
}

方案2(全量设置sys.path)

如果一定要用全量设置的方式,调整路径顺序、删除nltk目录的直接引入、修正空格错误即可:

// 标准库路径放最前面,不需要单独添加nltk目录,site-packages已经包含nltk的搜索路径
wchar_t * syspath = L"/usr/lib/python3.8:/home/txqcusr/.local/lib/python3.8:/home/txqcusr/.local/lib/python3.8/site-packages";
PySys_SetPath(syspath);

修改后重新编译C代码、链接NASM程序即可正常导入nltk库。

内容的提问来源于stack exchange,提问作者RTC222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:06:01