【问题标题】:PyImport_Import fails to import module that contains importsPyImport_Import 无法导入包含导入的模块
【发布时间】:2021-10-13 08:22:26
【问题描述】:

我正在开发一个 c++ 项目,该项目需要包含在 python 库 (scipy.stats) 中的一些功能。 我创建了使用 libray 的 python 脚本,我的想法是将数据从 c++ 传递到 python 脚本,调用函数并从 python 获取返回值。 但是当我执行 PyImport_Import(pName) 时,它返回 null,因为模块以导入开头。如果我使用另一个不以导入开头的脚本,它可以正常工作。 我做错了什么?

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++)

【问题讨论】:

    标签: python c++ python-c-api


    【解决方案1】:

    我找到了解决方案。发生这种情况是因为缺少 numpy 和 scipy 的调试符号。将visual studio设置为release模式解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2023-04-06
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多