python - 多次调用嵌入在 C++ 应用程序中的 Python 解释器会产生分段错误
问题描述
这个问题早先作为一个问题发布在rigetti/pyquil,建议在将其视为 Rigetti 的 pyquil 库中的错误之前询问 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
,而是使用此处描述的方法来提取返回值。问题是一样的,所以上面的程序只是为了让事情尽可能简单。
macOS 10.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
run()
从函数中删除第二个main()
,即不再调用 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 模块,但从未遇到过这个问题。任何帮助表示赞赏。
解决方案
推荐阅读
- c# - 从字符串列表中提取索引号
- python - 如何根据pandas中不同行的差异计算新列?
- python - 使用 Oracle Instant 客户端的高山依赖地狱
- python-3.x - ImportError:没有使用 sudo 命名的模块 pyaudio
- excel - 如何比较列和一个目标单元格之间的绝对差异,然后按 Abs diff 排序?
- command-line - 通过命令行连接到笔记本电脑上的移动网络
- amazon-web-services - 从 jenkinsfile 引用 Serverless.yml 文件中的环境变量
- python - PyAudio 回调在阻塞操作期间未运行
- java - 如何绕过 health.html 页面的上下文路径。我们的要求是在classpath下直接有health.html
- java - ischecked 工作的复选框 true/false,但不显示 ui 复选标记