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
相关产品推荐
相关产品推荐

