在学习C++调用python文件过程中,使用PyRun_SimpleFile()语句时无法实现执行python文件的情况。
例程如下:
#include "python.h"
int main()
{
Py_Initialize();
char szFile[] = "Test002.py";
FILE* fp = fopen(szFile, "r");
if(fp && PyRun_SimpleFile(fp,szFile) != 0)
{
fclose(fp);
printf("PyRun_SimpleFile(%s)failed!", szFile);
return -1;
}
Py_Finalize();
return 0;
}
Test002.py
print("this is a test file")
按照这个例程执行后,无法执行Test002.py中的语句。
经过排查发现是由于py文件的路径不正确,现提供如下两种可以正常调用python文件的写法
第一种:
#include "python.h"
int main()
{
Py_Initialize();
PyObject *obj = Py_BuildValue("s", "C:/Users/zhang/Desktop/test_python37/ConsoleApplication1/x64/Debug/Test002.py");
FILE *file = _Py_fopen_obj(obj, "r+");
if (file != NULL)
{
PyRun_SimpleFile(file, "Test002.py");
}
Py_Finalize();
return 0;
}
运行结果如下:
这种方法需要设置python文件的绝对路径。
第二中:
#include "python.h"
int main()
{
Py_Initialize();
PyObject * moduleName = PyUnicode_FromString("Test002");
PyObject * pluginModule = PyImport_Import(moduleName);
if (pluginModule == nullptr)
{
PyErr_Print();
return 0;
}
Py_Finalize();
return 0;
}
运行结果如下:
这种方式不需要设置python文件的绝对路径。
参考:
1、Why does the Python/C API crash on PyRun_SimpleFile?
2、C++调用Python浅析