PyImport_Import 无法导入包含导入的模块
PyImport_Import fails to import module that contains imports
我正在开发一个 c++ 项目,该项目需要 python 库 (scipy.stats) 中包含的一些功能。
我创建了使用 libray 的 python 脚本,我的想法是将数据从 C++ 传递到 python 脚本,调用函数并从 python 获取 return 值.
但是当我执行 PyImport_Import(pName) 时,它 return 为空,因为模块以导入开头。如果我使用另一个不以导入开头的脚本,它就可以正常工作。
我做错了什么?
chi2.py:
from scipy.stats import chi2, chi2_contingency
def chi2Test(alpha):
# contingency table
table = [ [2556, 9327, 1028, 564],
[770, 2991, 322, 164],
[433, 1566, 182, 97]
]
stat, p, dof, expected = chi2_contingency(table)
# interpret p-value
if p <= alpha:
return False
else:
return True
(table只是占位符,以后会变成参数)
main.cpp:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <chrono>
#include <random>
#include <windows.h>
#include <string>
#include <iostream>
#include "pyhelper.hpp"
int main() {
CPyInstance hInstance;
CPyObject pName = PyUnicode_FromString("chi2");
CPyObject pModule = PyImport_Import(pName);
if (pModule)
{
CPyObject pFunc = PyObject_GetAttrString(pModule, "chi2Test");
if (pFunc && PyCallable_Check(pFunc))
{
CPyObject pArgs = PyTuple_New(0);
CPyObject pArg = PyFloat_FromDouble(0.5);
PyTuple_SetItem(pArgs, 0, pArg);
CPyObject pValue = PyObject_CallObject(pFunc, pArgs);
bool res = PyObject_IsTrue(pValue);
}
else
{
printf("ERROR: function getInteger()\n");
}
}
else
{
printf_s("ERROR: Module not imported\n");
}
return 0;
}
CPyInstance 和 CPyObject 是 2 类 定义如下:https://www.codeproject.com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code
感谢任何可以提供帮助或有建议的人。
(这是我第一次使用嵌入了 python 的 C++)
我找到了解决方案。发生这种情况是因为缺少 numpy 和 scipy 的调试符号。在发布模式下设置visual studio解决了问题
我正在开发一个 c++ 项目,该项目需要 python 库 (scipy.stats) 中包含的一些功能。 我创建了使用 libray 的 python 脚本,我的想法是将数据从 C++ 传递到 python 脚本,调用函数并从 python 获取 return 值. 但是当我执行 PyImport_Import(pName) 时,它 return 为空,因为模块以导入开头。如果我使用另一个不以导入开头的脚本,它就可以正常工作。 我做错了什么?
chi2.py:
from scipy.stats import chi2, chi2_contingency
def chi2Test(alpha):
# contingency table
table = [ [2556, 9327, 1028, 564],
[770, 2991, 322, 164],
[433, 1566, 182, 97]
]
stat, p, dof, expected = chi2_contingency(table)
# interpret p-value
if p <= alpha:
return False
else:
return True
(table只是占位符,以后会变成参数)
main.cpp:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <chrono>
#include <random>
#include <windows.h>
#include <string>
#include <iostream>
#include "pyhelper.hpp"
int main() {
CPyInstance hInstance;
CPyObject pName = PyUnicode_FromString("chi2");
CPyObject pModule = PyImport_Import(pName);
if (pModule)
{
CPyObject pFunc = PyObject_GetAttrString(pModule, "chi2Test");
if (pFunc && PyCallable_Check(pFunc))
{
CPyObject pArgs = PyTuple_New(0);
CPyObject pArg = PyFloat_FromDouble(0.5);
PyTuple_SetItem(pArgs, 0, pArg);
CPyObject pValue = PyObject_CallObject(pFunc, pArgs);
bool res = PyObject_IsTrue(pValue);
}
else
{
printf("ERROR: function getInteger()\n");
}
}
else
{
printf_s("ERROR: Module not imported\n");
}
return 0;
}
CPyInstance 和 CPyObject 是 2 类 定义如下:https://www.codeproject.com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code
感谢任何可以提供帮助或有建议的人。 (这是我第一次使用嵌入了 python 的 C++)
我找到了解决方案。发生这种情况是因为缺少 numpy 和 scipy 的调试符号。在发布模式下设置visual studio解决了问题