嵌入扩展python会占用所有内存
embeding extended python eats all the memory
在遵循python嵌入/扩展教程时,我想出了以下代码
#include <boost/filesystem.hpp>
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args) {
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
static char SpamModuleName[] = "spam 00";
int main(int argc, char const *argv[]) {
Py_SetPath((
boost::filesystem::canonical("./python_lib.zip").wstring()
).c_str());
PyImport_AppendInittab(SpamModuleName,[](){
static PyMethodDef SpamMethods[] = {
{"system", spam_system, METH_VARARGS, "Execute a shell command."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT,
SpamModuleName,
NULL,
-1,
SpamMethods,
NULL, NULL, NULL, NULL
};
return PyModule_Create(&spammodule);
});
Py_Initialize();
PyRun_SimpleString(
"import spamn"
"status = spam.system("ls -l")n"
);
Py_Finalize();
return 0;
}
代码编译得很好(使用g++ -std=c++11 main.cpp -lpython33.64 -lboost_filesystem -lboost_system -s
,我使用x64原生mingw工具链由Stephan T. Lavavej),但当运行我的程序分配大约4 gig的ram和100%的cpu使用率(procexp截图)在PyRun_SimpleString("import spamn")
和更经常崩溃与python MemoryError
。
PyImport_ImportModule(SpamModuleName);
也使程序崩溃,也是在分配了大量内存之后(实际上我从未成功运行过这个函数)。
如果我结束所有其他程序,并释放尽可能多的内存,程序运行良好,并产生预期的输出,但资源消耗使它不可用。我做错了什么/什么使python使用那么多资源?
编辑在讨论了mingw-w64 irc之后,我得到了它的工作,并将发布解决方案作为答案,以防其他人发现自己在我的地方
由于用户alexey
和ktietz
的广泛帮助,我指出了用64位VC构建的python.dll在导入由GCC构建的x64二进制文件时存在问题。解决方案是自己构建这个库,同时给它打补丁以便在MINGWx64下编译。
你可以在这里找到这些补丁或者在这里找到预构建的库。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++ Python 的扩展 - 安全内存访问和内存布局
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 在动态分配的指针数组中扩展内存
- Python C++扩展 - 内存泄漏或访问冲突
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- 为内存管理扩展GCC
- SQLite是否使用SQLCipher扩展泄漏内存
- 在WinAPI、POSIX或API-OS等价物的其他扩展中,是否存在来自C++11的所有级别的内存屏障
- 如何创建一个可以随时间扩展的共享内存区域?
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?
- 嵌入扩展python会占用所有内存