我有一个C ++程序和一个Python脚本( loop.py )。
loop.py 的main
函数会生成随机数。
C ++程序使用Python C API调用 loop.py 的main
函数。我将Python代码封装在 PythonWrapper 静态类中。
这没有问题。 但现在,我想检索由 loop.py 生成的随机数。
我尝试在 loop.py 中创建一个getData
函数,并在启动main
函数后在C ++程序的另一个线程中调用它。但我得到了多个错误(分段错误,......)
我不明白这些问题是否与我尝试访问相同的Python模块或相同变量的事实有关,而且我不知道如何解决这些问题。 我还想过从Python脚本调用C ++函数来发送数字,但我找不到合适的方法。
如何从Python脚本中有效地检索这些数字?
这是 loop.py :
#!/usr/bin/python
import random
data = 200
def getData():
return (data);
def main():
while (42):
global data
data = random.randint(1, 10)
if __name__ == '__main__':
main()
这是 TestClass.cpp :
# include "TestClass.hh"
TestClass::TestClass()
{
_data = 200;
}
TestClass::~TestClass()
{}
void TestClass::launchThread()
{
PythonWrapper::callFuncFromModule("main", "loop");
}
void TestClass::launchLoop()
{
std::thread t(&TestClass::launchThread, this);
while (42)
{
_data = PythonWrapper::callFuncFromModule("getData", "loop");
_mtx.lock();
if (_data < 200)
std::cout << "Data : " << _data << std::endl;
_mtx.unlock();
}
t.join();
}
TestClass.hh :
#ifndef TEST_CLASS_HH
# define TEST_CLASS_HH
#include "PythonWrapper.hh"
#include <thread>
#include <mutex>
#include <iostream>
class TestClass
{
public:
TestClass();
~TestClass();
void launchLoop();
private:
void launchThread();
int _data;
std::mutex _mtx;
};
#endif /* TEST_CLASS_HH */
这是我的 PythonWrapper.cpp :
#include "PythonWrapper.hh"
PyObject *PythonWrapper::importModule(const std::string &filename)
{
PyObject *moduleName;
PyObject *module;
moduleName = PyUnicode_FromString(filename.c_str());
module = PyImport_Import(moduleName);
Py_DECREF(moduleName);
return (module);
}
int PythonWrapper::callFuncFromModule(const std::string &funcName, const std::string &moduleName)
{
PyObject *func;
PyObject *args;
PyObject *retValue;
PyObject *module;
int ret;
setenv("PYTHONPATH", ".", 1);
Py_Initialize();
module = importModule(moduleName);
func = PyObject_GetAttrString(module, funcName.c_str());
args = PyTuple_New(0);
retValue = PyObject_CallObject(func, args);
Py_DECREF(args);
Py_DECREF(retValue);
ret = PyLong_AsSize_t(retValue);
Py_Finalize();
return (ret);
}
PythonWrapper.hh
#ifndef PYTHONWRAPPER_HH_
# define PYTHONWRAPPER_HH_
# include <Python.h>
# include <iostream>
# include <string>
class PythonWrapper
{
public:
static int callFuncFromModule(const std::string &, const std::string &);
private:
static PyObject *importModule(const std::string &);
};
#endif /* PYTHONWRAPPER_HH_ */
main.cpp :
int main()
{
TestClass test;
test.launchLoop();
return (0);
}
以下是该计划的输出:
segmentation fault (core dumped)
如果可能的话,我想避免使用Boost.python或其他解决方案。
最好的问候。