此问题已作为问题早些时候发布在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
,而是使用了here描述的方法来提取返回值。问题是相同的,因此上面的程序只是为了说明示例,以使事情尽可能简单。
按如下所示在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模块,但从未遇到过此问题。任何帮助表示赞赏。