在C++应用程序中嵌入Python解释器的多个调用

2024-05-13 19:16:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题在早些时候作为一个问题发布在rigetti/pyquil上,建议在将其视为Rigetti的pyquil库中的一个bug之前咨询Python专家:

考虑以下小型应用程序,它在宿主应用程序中创建一个包含QASM代码的字符串,并调用Python解释器:

#include <Python.h>
#include <sstream>

static void run()
{
  std::stringstream ss;

  ss << "import pyquil\n"
     << "qasm = 'H 0'\n"
     << "p = pyquil.Program(qasm)\n"
     << "qc = pyquil.get_qc('9q-square-qvm')\n"
     << "result = qc.run_and_measure(p, trials=1024)\n"
     << "print(result)\n";

  Py_Initialize();
  PyRun_SimpleString(ss.str().c_str());
  Py_Finalize();
}

int main()
{
  run();
  run();
  return 0;
}

备注:在我的实际程序中,我没有使用PyRun_SimpleString,而是使用here描述的方法来提取返回值。问题是一样的,所以上面的程序只是为了举例说明,使事情尽可能简单。你知道吗

在macos10.13.6下编译代码如下

g++ -I/usr/local//homebrew/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/include/python3.7m -L/usr/local//homebrew/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib -lpython3.7m demo.cxx -o demo.exe

产生以下错误:

{0: array([1, 1, 0, ..., 1, 0, 0]), 1: array([0, 0, 0, ..., 0, 0, 0]), 2: array([0, 0, 0, ..., 0, 0, 0]), 3: array([0, 0, 0, ..., 0, 0, 0]), 4: array([0, 0, 0, ..., 0, 0, 0]), 5: array([0, 0, 0, ..., 0, 0, 0]), 6: array([0, 0, 0, ..., 0, 0, 0]), 7: array([0, 0, 0, ..., 0, 0, 0]), 8: array([0, 0, 0, ..., 0, 0, 0])}
Segmentation fault: 11

main()函数中删除第二个run(),即不再调用Python解释器,解决了这个问题。你知道吗

分段错误已经出现在import pyquil行。也就是说,这段代码已经在对run()的第二次调用中产生了分段错误:

#include <Python.h>
#include <sstream>

static void run()
{
  std::stringstream ss;

  ss << "import pyquil\n";

  Py_Initialize();
  PyRun_SimpleString(ss.str().c_str());
  Py_Finalize();
}

int main()
{
  run();
  run();
  return 0;
}

我一直在使用来自同一主机应用程序的多个Python解释器调用和许多其他Python模块,但从未遇到过这个问题。感谢您的帮助。你知道吗


Tags: run代码pyimport应用程序includemainpyrun