c++ - 重复调用 PyRun_SimpleFile 时出现分段错误
问题描述
我想在 c++ 中嵌入用 3.5 版编写的 python 代码。此外,python 脚本需要作为整个脚本重复执行。我的代码如下。它在第一次迭代中执行良好,在第二次迭代中出现分段错误。
主.cpp:
#include <Python.h>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i = 0;
while(i<3){
cout<<"start"<<endl;
Py_Initialize();
FILE* file;
wchar_t* _argv[argc];
for(int i=0; i<argc; i++){
wchar_t *arg = Py_DecodeLocale(argv[i], NULL);
_argv[i] = arg;
}
PySys_SetArgv(argc, _argv);
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyUnicode_FromString("."));
file = fopen("./example.py","r");
PyRun_SimpleFile(file, "./example.py");
fclose(file);
Py_Finalize();
cout<<"Done"<<endl;
i++;
}
return 0;
}
例子.py:
import tensorflow as tf
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'initial learning rate')
def main(argv=None):
print(FLAGS.learning_rate)
if __name__ == '__main__':
main()
我使用:构建项目
cmake --build . --target Demo -- -j 2
并执行为:
./Demo --learning_rate 0.02
输出是:
start
0.02
Done
start
Segmentation fault (core dumped)
然后我将“example.py”的内容替换为:
print("Hi")
输出是:
start
Hi
Done
start
Hi
Done
start
Hi
Done
如何解决上述分段错误?
解决方案
查看文档
如果多次调用它们的初始化例程,某些扩展可能无法正常工作;如果应用程序多次调用 Py_Initialize() 和 Py_Finalize(),就会发生这种情况。
推荐阅读
- python - 在特定日期替换 pandas DataFrame 中的 NaN(上采样)
- mysql - 存储过程 Mysql BEGIN END
- r - 在 R 中格式化 numericInput
- python - Python-如何更新列表的列表
- c - 可以通过这种方式使用 printf() 进行二进制打印吗?
- javascript - 使用空的while循环来增加一个值好吗?
- laravel - 如何使用 laravel 5.7 创建用于 excel 上传的 api
- php - codeigniter 3上的加密
- java - 为 CI 设置 Spark,如何模拟 Hive 表
- angular - Angular - 如果稍后的请求失败,则取消先前的 HTTP 请求