启动Python循环&获取数据

时间:2018-02-16 21:54:28

标签: python c++

我有一个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或其他解决方案。

最好的问候。

0 个答案:

没有答案