扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在函数声明加入前缀,如
成都创新互联-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、成都服务器托管、等保安全、私有云建设等企业级互联网基础服务,服务电话:18980820575
__declspec(dllexport) int Fun(int a, int b)
否则在加载该dll时会提示找不到该符号
在windows下可以通过vs自带的dumpbin工具查看可被调用符号
dumpbin /exports test.dll
C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定
python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件,根据C dll的调用规定不同需要使用不同接口,使用ctypes需要 import ctypes 库
对于简单的C函数,例如 int add(int a, int b) , 此时就可以直接调用了,如
对于较复杂的C函数的参数情况,ctypes调用时对入参和出餐做一定处理,这里分情况讨论
以上包含了几种主要的参数传递情况,ctypes也提供了一个较为完整的python类型和C类型的对照,如下:
if
__name__=="__main__":
'main'
当脚本作为执行脚本时__name__的值为__main__当脚本作为模块时__name__为模块文件名。举个例子,a.py作为执行脚本时__name__的值是__main__。有2个脚本,a.py和b.py,a中引入b,执行a.py时,在b中模块的__name__就是b.py
第一点:语言类型不同
python是一种动态类型语言,又是强类型语言。它们确定一个变量的类型是在您第一次给它赋值的时候。C是静态类型语言,一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。
第二点:对象机制不同
python中所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念。每一个对象都有三种属性:实体、类型和值。C中没有对象这个概念,只有数据的表示。
第三点:变量类型不同
python六个标准的数据类型:Number数字、string字符串、List列表、Tuple元组、Sets集合、Dictionary字典,数字类型有四种类型:整数、布尔型、浮点数和复数。C语言也可分四类:基本类型、枚举类型、void的类型、派生类型,基本类型:整数类型、浮点类型。
第四点:函数库的使用方法不同
在C语言中使用那个库函数,需要引入头文件用include引入,而在python中需要引入别的模块或者函数时需要用import引入。
两者的不同机制是C语言中include是告诉预处理器,这个include指定的文件的内容,要当作本地源文件出现过,而python中的import可以通过简单的import引入,或者是import
numpy as np。
第五点:全局变量不同
在C语言中,声明全局变量,如果值是恒定的,那么可以直接用#define声明,如果只是声明全局,并且变量的值是可变的,那么直接类似int
a就可以了。
在python中,声明全局变量时,需要加上global,类似global a,在函数里面使用的时候需要先声明global
a,否则直接用a那么python会重新创建一个新的本地对象并将新的值赋值给他,原来的全局变量的值并不变化。
(1)从Boost官方网站下载Boost库源文件,将其解压至某一目录中。
(2)将Boost解压至的目录添加到VC++ 6.0的【Include files】中,
(3)进入Boost目录下的“libs\python\build\VisualStudio”子目录中,在VC++ 6.0中打开其中的“boost_python.dsw”文件。
(4)单击【Build】|【Batch Build】命令,分别编译Boost.Python的Debug和Release版。
(5)编译完成后将在Boost目录下的“libs\python\build\bin-stage”子目录中生成动态链接库和库文件。由于使
用Boost.Python编写的Python扩展在运行时根据版本不同需要“boost_python.dll”和
“boost_python_debug.dll”文件。为了方便,可以将其放到Windows安装目录下的“system32”目录下。否则,需要将其
和Python扩展放在同一目录中。
(6)将Boost目录下的“libs\python\build\bin-stage”子目录添加到VC++ 6.0的【Library files】中,
完成上述设置后就可以使用Boost.Python编写Python扩展了。
使用Boost.Python扩展和嵌入Python
通过Boost.Python可以在Python内使用C++类和函数。和SWIG一样Boost.Python简化了编写Python扩展的代码,而不用使用Python/C API。但与SWIG不同,Boost.Python是一个类库,无需再使用接口文件。
初始化和方法列表
在Boost.Python中可以通过使用BOOST_PYTHON_MODULE来命名模块名。在BOOST_PYTHON_MODULE中则可以使用def来实现使用Python/C API定义的方法列表。以下是一个简单的例子。
void show()
声明show函数
{
cout "Boost.Python";
}
BOOST_PYTHON_MODULE(example)
使用BOOST_PYTHON_MODULE命名模块名为“example”
{
def("show",show);
相当于定义方法列表
以上就是对如何编译Boost.Python以及如何使用Boost.Python扩展和嵌入Python的相关的内容的介绍,望你会有所收获。
若你是想调用 c 编写的DLL,可以使用ctypes调入使用;
#!/usr/bin/python
from ctypes import *
import os
#需要使用绝对路径
extest = cdll.LoadLibrary(os.getcwd() + '/DemoC.so')
或在windows下
#!/usr/bin/python
import ctypes
import os
if os.name == 'nt': # windows系统
_lib_name = os.getcwd() + '/DemoC.DLL'
dl200_lib = ctypes.WinDLL(dl200_lib_name)
1、语言类型不同
Python是一种动态类型语言,又是强类型语言;C语言是静态类型语言,在编译期间就确定数据类型的语言;
2、内存管理不同
Python使用自动垃圾收集器进行内存管理;C语言中程序员必须自己进行内存管理;
3、对象机制不同
Python所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念;C语言中没有对象这个概念,只有数据的表示。
4、运行效率不同
Python有一个GIL锁,导致其对多线程支持不够好,运行速度比较慢;C语言比较快,是很好的底层语言,运行效率上优于Python。
5、变量类型不同
Python有六个标准的数据类型,包含Number数字、String字符串、List列表、Tuple元祖、Sets集合、Dictionary字典;数字类型有四种,包含:整数、布尔型、浮点数和复数。C语言也分为四大类,其中包含基本类型、枚举类型、void的类型、派生类型,基本类型包含整数类型、浮点类型。
6、函数库的使用方法不同
C语言中使用库函数,需要引入头文件用include引入;Python中需要引入别的模块或者函数时需要用import引入。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流