闹腾的小逗比 2019-07-08 11:18 采纳率: 0%
浏览 808
已采纳

Python + C/C++ 嵌入式编程:Qt向Python传递数组

编程环境Qt5.7.1 MSVC版,VS2013,python3.7.1,我使用Qt像python传递字节数组,Qt和python代码如下,当多次点击按钮多次调用(第二次调用时)python程序时,提示程序异常结束。

Qt程序:
INCLUDEPATH +=D:/Python3.7.3/include
INCLUDEPATH += D:/Python3.7.3/Lib/site-packages/numpy/core/include
LIBS += -LD:/Python3.7.3/libs/ -lpython37

int init_numpy()
{
import_array();

}

void MainWindow::on_ButtonNumpy_clicked()
{

Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
init_numpy();

if (!Py_IsInitialized())
{
printf("初始化失败!");
return ;
}

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径
PyObject pModule = PyImport_ImportModule("demo2");//这里是要调用的文件名hello.py
PyObject pDict = PyModule_GetDict(pModule);
if (pModule == NULL)
{
printf("Can't open python file\n");
return ;
}
//PyObject pFunc = PyObject_GetAttrString(pModule, "szSecTest");
double CArrays[3][3] = {{1.3, 2.4, 5.6}, {4.5, 7.8, 8.9}, {1.7, 0.4, 0.8}};
qDebug()<<"rrr";
npy_intp Dims[2] = {3, 3};
//生成包含这个多维数组的PyObject对象,使用PyArray_SimpleNewFromData函数,第一个参数2表示维度,第二个为维度数组Dims,第三个参数指出数组的类型,第四个参数为数组
PyObject PyArray = PyArray_SimpleNewFromData(2, Dims, NPY_DOUBLE, CArrays);
PyObject ArgArray = PyTuple_New(1);
PyTuple_SetItem(ArgArray, 0, PyArray);
PyObject pFunc = PyDict_GetItemString(pDict , "Test");//这里是要调用的函数名
// PyObject * pFunc = PyObject_GetAttrString(pModule , "Test");
if (!pFunc){
printf("Get function hello failed\n");
return ;
}

PyObject *pRrturn = PyObject_CallObject(pFunc, ArgArray);
qDebug()<<pRrturn;

PyArray = NULL;

ArgArray = NULL;
pRrturn = NULL;
pModule=NULL;
pDict=NULL;
Py_Finalize();

}
python程序:import numpy as np
def Test(test):
print (test.shape,test[0], test[1],test[2])
报错:
Starting F:\Qt\build-TestNumpy-Desktop_Qt_5_7_1_MSVC2013_32bit-Release\release\TestNumpy.exe...
rrr
(3, 3) [1.3 2.4 5.6] [4.5 7.8 8.9] [1.7 0.4 0.8]
0x66937c44
D:\搜狗输入法\SogouInput\Components\程序异常结束。
F:\Qt\build-TestNumpy-Desktop_Qt_5_7_1_MSVC2013_32bit-Release\release\TestNumpy.exe crashed.

  • 写回答

2条回答

  • 拉灯的小手 博客专家认证 2019-07-09 13:19
    关注

    可以把调用的子程序打包一下或者每次调用前杀死前一次的调用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题