C DLL中的Python对象
Python Objects in C++ DLL
i编码C++ DLL
用于MQL4
。我必须使用一些python
模块。
dll代码:
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
//#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include "Python.h"
#include "numpy/arrayobject.h"
//----
#define MT4_EXPFUNC __declspec(dllexport)
PyObject *Amanda;
PyObject *AmandaZones;
#pragma pack(push,1)
#pragma pack(pop)
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Py_Initialize();
import_array1(-1);
PyObject *pName;
pName = PyString_FromString("Amanda");
Amanda = PyImport_Import(pName);
Py_DECREF(pName);
if (Amanda != NULL){
AmandaZones = PyObject_GetAttrString(Amanda, "CalculateZones");
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
Py_DECREF(Amanda);
Py_DECREF(AmandaZones);
Py_Finalize();
break;
}
//----
return(TRUE);
}
MT4_EXPFUNC int __stdcall CalculateZones(double *data, double quantile,const int arraySize)
{
if (arraySize < 1 || data == NULL) return 2;
if (AmandaZones == NULL) return 0;
return 1;
}
它运行良好,直到我将其从Metatrader
删除并再次附加。它返回0,这仅表示AmandaZones
是NULL
。
简单地说,如果第二次附加了DLL文件,则不会加载PyObjects
并返回null指针。代码有什么问题?我认为这是一个内存泄漏问题,因为如果我删除if (AmandaZones == NULL) return 0;
,它将抛出Access Violation Read error
。
谢谢
numpy
在使用C 时不应两次初始化。Py_finilize()
无法正常工作,也不会删除numpy
模块对象。我从这里https://github.com/numpy/numpy/issues/8097
相关文章:
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- 如何将来自 Boost.Python 的map_indexing_suite与自定义而不是标准对象一起使用?
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- 了解 Python 中的对象类型
- 从从该抽象类派生的 Python 对象强制转换C++抽象类C++
- 如何创建和使用存储为 c++ 对象的 python 对象?
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 在C++中运行 python 对象
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 在 boost::p ython 中的 python 对象中运行 python 代码
- 添加 swig pythoncode 以在 Python 对象上设置自己的标志
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- C DLL中的Python对象
- 使用 python 胶囊在 cython 和 pybind11 之间传输 c++ 对象
- Boost.Python 返回引用现有 c++ 对象的 python 对象