Python3调用C++:HellowWorld

41 篇文章 3 订阅

百度搜过,没多少说这个的,来来去去就一连篇文章,而且是python2的。

搜到一个python3,复制下来,还得研究半天。

所以自己记录一下,免得忘记,毕竟不是专业写python的。

python:3.8

C++:Visual Studio 2019的C++

 

基本逻辑就是把C++部分的代码编译成dll。然后python当做一个库直接导入。

一开始觉得不方便。不能像Python那样直接执行。但其实再想想,运行C++程序,本来就要编译的,就没觉得什么了。

C++部分的代码:

#include <Python.h> 
#include <iostream>

void Add()
{
	std::cout << "~HelloWorld~" << std::endl;
}

/*
如果C函数没有返回值(返回 void 的函数),则必须返回None(可以用Py_RETUN_NONE宏来完成):
*/
static PyObject* WrappAdd(PyObject* self, PyObject* args)
{
	Add();
	Py_INCREF(Py_None);
	return Py_None;
}

static PyMethodDef test_methods[] = {
	{ "Add", WrappAdd, METH_VARARGS, "something" },
	{ NULL, NULL , 0, NULL }
};

static struct PyModuleDef PCmodule = {
	PyModuleDef_HEAD_INIT,
	"PyCallCpp",   /* name of module */
	NULL, /* module documentation, may be NULL */
	-1,       /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
	test_methods
};

PyMODINIT_FUNC
PyInit_PyCallCpp(void)
{
	return PyModule_Create(&PCmodule);
}

上面这段代码,这个CPP文件放着就行了。原理并不是很清楚,毕竟我现在才写了HelloWorld而已。

不过要注意的是,PyCallCpp是我的工程名字。上面的模块定义也要写上对应的名字。有两个地方,看不明白的就搜一下替换好了。

上面引入了python的头文件。这个头文件在python的安装目录下,例如我的Python就安装在D盘下,那么具体路径就是D:\Python\Python38-32\include

如果是正式项目组,可以把这个include目录复制出来放在自己想要的地方,然后提交到SVN或者GitHub就行了。

而无论是引入,还是生成dll,都是需要配置的。

这里要用Release的方式,没办法,找到别人的例子就是这样的下拉按钮,再点编辑,就会出现上面的弹框。

在对应的C++项目,点右键,属性,(这个截不了图)打开上图界面。选择C/C++,选择附加包含目录。点击文本框的

我是在当前工程下加了个include文件夹的,写了./include。如果写上安装目录下的include目录,填上D:\Python\Python38-32\include就行了。

这个是用来包含一些路径,方便引入文件的时候,不需要写太多绝对路径或者相对路径。所以我加了./

这样就能编译成exe文件了,默认是这样,但是我们要的是dll文件。

如上图,改为生成dll的方式。也是选择的

还要改后缀名,当然也是可以通过配置实现的。

这个其实我也不知道是不是必须的哈哈

到这里算是生成dll了。但是要放到对应的地方,python的引入没C++那么方便,不知道是不是我自学的原因。

加了个copy /y "$(TargetPath)" "..\ZergApp\" ,把生成的文件复制到自己的Python的目录下就好了。

因为懒,所以我放到python项目的根目录了。

然后Python 部分怎么写?

import PyCallCpp as ca

ca.Add()

就这样,引入和使用就行了。之后如果有改动C++,生成一下就知道复制到对应目录了。

执行一下是能打印HelloWorld的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值