如何在C中导入含numpy等第三方包的.py文件?问题排查与解决
Python-C-API调用含Numpy的Python脚本报错解决
场景与代码
使用Visual Studio,通过Python-C-API从C/C++文件导入Python脚本,调用PythonApplication7.py中定义的lalala函数。
C文件代码
#include <Python.h> int main() { PyObject* pModule, * pFunc; int a = 10, b = 20; int result; Py_Initialize(); pModule = PyImport_ImportModule("PythonApplication8");//here, import a python file without 3rd party package if (!pModule) { PyErr_Print(); //print error } pFunc = PyObject_GetAttrString(pModule, "func1"); if (!pFunc || !PyCallable_Check(pFunc)) { PyErr_Print(); Py_XDECREF(pModule); } PyObject* pValue1 = Py_BuildValue("i", a); PyObject* pValue2 = Py_BuildValue("i", b); if (!pValue1 || !pValue2) { Py_XDECREF(pValue1); Py_XDECREF(pValue2); } PyObject* pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs, 0, pValue1); PyTuple_SetItem(pArgs, 1, pValue2); PyObject* pValue = PyObject_CallObject(pFunc, pArgs); PyArg_Parse(pValue, "i", &result); printf("The result is: %d\n", result); Py_Finalize(); return 0; }
同目录下PythonApplication8.py代码
import PythonApplication7 as p def func1(a,b): return p.lalala(a,b)
PythonApplication7.py代码
import math import numpy def lalala(a,b): return a+b c=math.sqrt(1)
问题现象
- 未导入numpy时,C与Python间可正常传参并获取函数输出
- 导入numpy后触发错误:
ModuleNotFoundError: No module named'numpy.core._multiarray_umath',附带提示无法从numpy源码目录导入该模块
已执行的排查操作
- 将包含numpy的Python DLLs、Lib目录文件复制到C编译后的exe同目录
- 采用Python 3.9版本,VS中已配置对应Python的包含路径和库路径
- 直接在Python环境中导入numpy无异常
- 查阅官方排查文档后未找到解决办法
最终解决方法
12月24日更新:移除VS链接器中添加的python39_d.dll附加依赖(调试符号文件),保留其他默认链接器设置后,问题得到解决。
内容的提问来源于stack exchange,提问作者Dzhou
相关产品推荐
相关产品推荐

