VS2013+python+boost.python 实现python调用c++方法

环境:

win7-64位

VS2013

python-2.7.8-32位 (得用32位,这很重要)

boost.python-1.57

步骤:

一. “安装”boost.python

解压boost.python后,用VS的[本机命令提示工具](开始-VS2013-VS Tools)进入到boost的文件夹,运行bootstrap.bat生成bjam.exe。然后运行:

bjam --with-python link=shared runtime-link=shared

来编译出boost.python的库。成功的话会在boost_1_57_0\stage\lib下生成4个文件。

如果失败的话,检查一下:

  • python是否为32位,不用能64位。(我也不知道为啥)
  • 有没打错字,其实是我没遇到其他导致失败的原因,赫赫。

解释一下bjam这里用到的参数(详细参数说明可以运行bjam --help查看):

  • --with:只编译指定的库,如输入--with-python就只编译python库了,不加的话会编译全部库得用很长时间。
  • link:(注意前面没有-)使用静态库还是动态库。
  • runtime-link:(注意前面没有-)是静态还是动态链接C/C++标准库。

link和runtime-link都要设为shared,因为到时导出dll时得用到动态的库。

二. 使用VS2013生成dll

用VS2013新建一个win32 dll项目(例如项目名称为boostDemo),然后设置几个项目属性:

  • C/C++-附加包含目录:${boost根目录};${python根目录}\include;。
  • C/C++-代码生成-启用最小重新生成:否。
  • C/C++-预编译头:不使用。
  • 链接器-附加库目录:${boost根目录}\stage\lib;${python根目录}\libs;

在boostDemo.cpp中输入代码:

#include "stdafx.h"
#include <boost\python.hpp>

char const* greet()
{
	return "hello world";
}

BOOST_PYTHON_MODULE(boostDemo)
{
	using namespace boost::python;
	def("greet", greet);
}

然后生成dll文件,将dll文件名更改为boostDemo.pyd(注意为什么是boostDemo)。

三. python调用

将刚才生成的boostDemo.pyd和${boost根目录}\stage\lib下的boost_python-vc120-mt-gd-1_57.dll复制到python项目的根目录。

在python项目入口源文件中输入代码:

import boostDemo
print boostDemo.greet()

运行之,如无意外,会输出:

>>hello world

大功告成!下次会讲怎么导出C++类。

时间: 2024-09-30 20:33:54

VS2013+python+boost.python 实现python调用c++方法的相关文章

2015/10/9 Python基础(21):可调用和可执行对象

在Python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的Python脚本,或执行一个磁盘上的文件,或通过网络来运行文件.这完全取决于想要干什么.特定的环境包括: 在当前脚本继续运行 创建和管理子进程 执行外部命令或程序 执行需要输入的命令 通过网络来调用命令 执行命令来创建需要处理的输出 执行其他的Python脚本 执行一系列动态生成的Python语句 导入Python模块 Python中,内建和外部模块都可以提供上述各种功能.程序员得根据实现的需要,从这些模块中选择合适的处理方

Python实例浅谈之三Python与C/C++相互调用

一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可. (1)C语言文件:pycall.c /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h> int f

利用boost.python 通过c++语言来扩展python (python.boost)

python语言的优良性就不多说了,我想提下如何使用boost.python,通过boost.python既可以将python转移到C++上,通过Python库,也可以通过C++来扩展python,下面主要介绍使用boost.python来扩展python的功能,第一次用boost.python,倒腾了半天才搞定: 首先列出我的测试环境: 我用的是VS2010,python2.7,我用VS2010创建了一个windows DLL的项目,项目名称为pylib,在DLL main中加入如下代码: /

Python调用java方法

需求 最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁.因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意.最后转换思路找到了一种好方法: 1. 将java项目打成jar包: 2. 设定jar包的Main-class属性: 3. 在python中通过subprocess执行jar包. 修改main函数打jar包 在intellij中打jar包: 1. File--> Project Structure... --> Artifacts --&g

`python`被`C# `调用的方法

目的: 熟悉markdown 记录python被C#调用的方法 参考材料: markdown语法 python被C#调用的方法(参考自博客内容) 调用方法: 采用Ironpython: 优点: 快捷方便,方便传递参数等,因为相当于是将python代码传递进C#之中进行操作,语法逻辑比较清楚. 缺点: 需要额外配置Ironpython, 且不支持python3.X.不共享系统中安装的python环境包,需要额外配置路径或者重装numpy之类的软件包. 示例代码: using IronPython.

Python随心记--进程调用

进程调用 from multiprocessing import Process import time def f(name): time.sleep(1) print('hello',name,time.ctime()) if __name__ == '__main__': p_list = [] for i in range(3): p = Process(target=f,args=('alive',)) p_list.append(p) p.start() for i in p_lis

python使用subprocess及delegator调用第三方程序

前言 python里调用第三方程序一般用subprocess模块都可以满足了,但是同程序的交互方面使用subprocess没有到合适的方法,这里使用了一个第三方模块delegator.py.它实际上是对subprocess和pexpect.popen_spawn封装.但其subprocess封方式无法达我的要求(比如无法获取到实时的return_code), 因此主要使用了它里面的与程序交互的部分.其他部分直接使用subprocess 安装delegator.py需要使用以下命令: pip in

(一)Python入门-6面向对象编程:04__del__方法(析构函数)和垃圾回收机制-__call__方法和可调用对象

一:__del__方法(析构函数)和垃圾回收机制 __del__方法称为“析构方法”,用于实现对象被销毁时所需的操作.比如:释放对象 占用的资源,例如:打开的文件资源.网络连接等. Python实现自动的垃圾回收,当对象没有被引用时(引用计数为 0),由垃圾回收器 调用__del__方法. 我们也可以通过del 语句删除对象,从而保证调用__del__方法. 系统会自动提供__del__方法,一般不需要自定义析构方法. [操作] #析构函数 class Person: def __del__(s

Python与C/C++相互调用(转)

原文链接 作者 一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可.(1)C语言文件:pycall.c /***gcc -o libpycall.so -shared -fPIC pycall.c*/ #include <stdio.h> #include <stdlib.h>

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称