c/c++和python混合编程试验の一

一、c/c++中调用python

1️⃣c/c++中调用python内置函数

因为我们编写c/c++引用python往往需要python的c接口,就是我们python安装目录的include和libs目录下面的头文件和第三方库文件,即.h文件和.dll文件。最简单的办法是在工程目录下放进include目录和libs目录,即.vcxproj文件所在目录
c/c++和python混合编程试验の一_第1张图片
最简单的办法就是你右键打开你的工程菜单,然后点击打开[在文件资源管理器中打开文件夹],然后在代码中添加Python.h头文件

#include 
#include 

int main(int argc, char *argv[]) {

	Py_Initialize();//初始化python解释器
	PyRun_SimpleString("print('Hello, world')\n");//调用python内置函数print
	Py_Finalize();//销毁python解释器
	system("pause");
	return 0;
}

我上面只添加了我的libs目录,所以头文件添加用的是绝对路径,如果你添加include目录进去工程,那就使用相对路径include/Python.h即可
然后是我们的附加依赖
c/c++和python混合编程试验の一_第2张图片
在附加库目录处添加上libs目录即可,我们就可以使用python的c接口进行编程了。
运行结果如下:
c/c++和python混合编程试验の一_第3张图片
需要注意的环境:
你的vs工程的环境要和python解释器的环境相同,比如我的是64位,我的vs环境就设成的x64环境。
在这里插入图片描述

关于python的c接口的官方说明可以查看这里

2️⃣c/c++调用python脚本

首先,我们创建一个python脚本
c/c++和python混合编程试验の一_第4张图片

关于调用脚本,就是在上面的基础上添加PyObject的使用,并添加对应模块进行相应使用,具体过程可以参照正常python代码流程:import模块,调用具体函数或者对应。
注:如果你使用的是比较新版本的python,那你的调用会有一些问题,关于PyEval_CallObject的,因为它其实是一个宏定义,是对PyEval_CallObjectWithKeywords的封装,所以你运行会出现PyEval_CallObjectWithKeywords已被弃用的信息。要用PyEval_CallObject的变体。
代码如下:

#include 
#include 

int main(int argc, char *argv[]) {

	Py_Initialize();
	PyObject *pModule, *pFunc = nullptr;
	if (Py_IsInitialized()) {
		PyRun_SimpleString("import sys");
		PyRun_SimpleString("sys.path.append('./')");
		pModule = PyImport_ImportModule("test");

		if (!pModule) {
			std::cout << "导入模块失败" << std::endl;
		}
		else {
			pFunc = PyObject_GetAttrString(pModule, "sayhi");
			if (!pFunc) {
				std::cout << "导入函数失败" << std::endl;
			}
			else {
				PyObject_CallObject(pModule, nullptr);
			}
		}
	}
	else {
		std::cout << "初始化失败" << std::endl;
	}

	Py_Finalize();
	system("pause");
	return 0;
}

输出结果,不出意料的失败了。。。。。。
c/c++和python混合编程试验の一_第5张图片
查了不少资料才发现,好像是因为我的py文件名的问题。因为python本身就有test模块,所以我命名为test的时候调用的是python内置的test,所以就会出现找不到函数的情况。不过这一点在你使用python进行直接调用而不是python的c接口的时候,倒也可以直接调用。结果如下:

PS H:\project\c&c++ course\call_python\call_python> python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.hi
Traceback (most recent call last):
  File "", line 1, in <module>
AttributeError: module 'test' has no attribute 'hi'
>>> test.sayhi()
Hello, world.
>>>

好,改过来了,运行失败。。。。。。
c/c++和python混合编程试验の一_第6张图片
现在是内部函数无法调用,但接口过多,资料太少,就先搁浅一下了。

下下下一节

你可能感兴趣的:(python,c++)