以下是在C++中调用Python函数的最简示例,我的系统上存在内存泄漏问题:
:
产生以下摘要。
我正在使用
移除
此外,当我在 Python 中创建一个 Keras 层时,...
import tensorflow
def foo(param):
return "something"
main.cpp
:
#include "python3.5/Python.h"
#include <iostream>
#include <string>
int main()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("if not hasattr(sys,'argv'): sys.argv = ['']");
PyRun_SimpleString("sys.path.append('./')");
PyObject* moduleName = PyUnicode_FromString("script");
PyObject* pModule = PyImport_Import(moduleName);
PyObject* fooFunc = PyObject_GetAttrString(pModule, "foo");
PyObject* param = PyUnicode_FromString("dummy");
PyObject* args = PyTuple_Pack(1, param);
PyObject* result = PyObject_CallObject(fooFunc, args);
Py_CLEAR(result);
Py_CLEAR(args);
Py_CLEAR(param);
Py_CLEAR(fooFunc);
Py_CLEAR(pModule);
Py_CLEAR(moduleName);
Py_Finalize();
}
编译使用
g++ -std=c++11 main.cpp $(python3-config --cflags) $(python3-config --ldflags) -o main
并使用valgrind运行
valgrind --leak-check=yes ./main
产生以下摘要。
LEAK SUMMARY:
==24155== definitely lost: 161,840 bytes in 103 blocks
==24155== indirectly lost: 33 bytes in 2 blocks
==24155== possibly lost: 184,791 bytes in 132 blocks
==24155== still reachable: 14,067,324 bytes in 130,118 blocks
==24155== of which reachable via heuristic:
==24155== stdstring : 2,273,096 bytes in 43,865 blocks
==24155== suppressed: 0 bytes in 0 blocks
我正在使用
Linux Mint 18.2 Sonya
、g++ 5.4.0
、Python 3.5.2
和 TensorFlow 1.4.1
。移除
import tensorflow
后内存泄露问题得到了解决。是 TensorFlow 的一个 bug 还是我的操作有误?(我觉得后者更有可能。)此外,当我在 Python 中创建一个 Keras 层时,...
#script.py
from keras.layers import Input
def foo(param):
a = Input(shape=(32,))
return "str"
并且重复地从C++中调用Python
//main.cpp
#include "python3.5/Python.h"
#include <iostream>
#include <string>
int main()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("if not hasattr(sys,'argv'): sys.argv = ['']");
PyRun_SimpleString("sys.path.append('./')");
PyObject* moduleName = PyUnicode_FromString("script");
PyObject* pModule = PyImport_Import(moduleName);
for (int i = 0; i < 10000000; ++i)
{
std::cout << i << std::endl;
PyObject* fooFunc = PyObject_GetAttrString(pModule, "foo");
PyObject* param = PyUnicode_FromString("dummy");
PyObject* args = PyTuple_Pack(1, param);
PyObject* result = PyObject_CallObject(fooFunc, args);
Py_CLEAR(result);
Py_CLEAR(args);
Py_CLEAR(param);
Py_CLEAR(fooFunc);
}
Py_CLEAR(pModule);
Py_CLEAR(moduleName);
Py_Finalize();
}
应用程序在运行时内存消耗不断增加,无限增长。
因此我猜测从C++调用Python函数的方式存在根本性错误,但是是什么呢?