在学习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浅析

更多推荐

C++ 调用Python:PyRun_SimpleFile 无法执行