python和C++能进行有效的交互,c++调用Python的一些小用法

写了一个python脚本导入发生异常,可能是编码问题(如存在中文),
Python默认的是ASCII
可加上:
#!/usr/bin/python
# -*- coding: utf-8 -*-
参见:https://www.python.org/dev/peps/pep-0263/

定义类C数据结构:
class Point(Structure):
_pack_ = 1
_fields_ = [('x', c_uint8),
('y', c_uint8),
]
定义点数组初始化:
pointList = [Point(0,0),
Point(1,1),
]
访问:pointList[i].x, pointList[i].y
也可强制转换为指针访问
pPoint = cast(addressof(point),POINTER(Point))
指针有一个属性contents为实例对象
pPoint.contents.x, pPoint.contents.y

想要定义数组:
class Array(Structure):
_pack_ = 1
_fields_ = [('iArray', c_uint8 * 5),
('bArray', c_ubyte * 5),
]
定义缓冲区:
buf = c_buffer("Hello",520)
buf = create_string_buffer("Hello", 10)
第二个是新一点的,旧的也可以用

ctypes的数据类型:https://docs.python.org/2/library/ctypes.html#ctypes.c_ubyte

addressof(obj): 获取ctypes类型地址
byref(obj, offset):
返回ctypes类型轻量级指针
对应以下C代码:(((char *)&obj) + offset)
sizeof: 计算变量和类型的字节数

调用c库的一些函数:
libc = cdll.msvcrt
fopen = libc.fopen
fwrite = libc.fwrite
fclose = libc.fclose
fseek = libc.fseek
fread = libc.fread
ftell = libc.ftell
memset = libc.memset
memcpy = libc.memcpy
可获取函数地址,调用与C一样,注意这些函数操作需要地址
可以用addressof获取ctypes类型的地址

接收C++传来的参数:
如果传过来的是Unicode字符需要转换为python字符串,否则会出现意想不到的错误
虽然用打印和写入文件的方式写入param内容是正确的,但是实际调用libc库时仍会
找不到路径
str(unicode(param))

使用python时如果更加了解其内在机制,会对使用该语言更有帮助

下面上代码:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
from ctypes import * class CPoint(Structure):
_pack_ = 1
_fields_ = [('x', c_uint8),
('y', c_uint8),
] class CArray(Structure):
_pack_ = 1
_fields_ = [('iArray', c_uint8 * 5),
('bArray', c_char * 5),
] def EditBuf(buf, len):
tmp = buf
i = 0
val = c_char('')
while i < len:
memmove(addressof(tmp)+i,addressof(val),sizeof(val))#addressof(tmp)+i相当于指针移位
i += 1 libc = cdll.msvcrt
fopen = libc.fopen
fwrite = libc.fwrite
fclose = libc.fclose
fseek = libc.fseek
fread = libc.fread
ftell = libc.ftell
memset = libc.memset
memcpy = libc.memcpy if __name__ == '__main__':
point = CPoint(5,6)
pPoint = cast(addressof(point),POINTER(CPoint))
print "point.x = %d , point.y = %d" %(point.x, point.y)
print "pPoint.x = %d , pPoint.y = %d" %(pPoint.contents.x, pPoint.contents.y)
print point, pPoint.contents#这里两个地址值不一样说明系统为pPoint新申请了一个Point保存复制的值 pointList = [CPoint(0,1),
CPoint(2,3)
]
print pointList[0].x, pointList[0].y#数组 iArr = (c_uint8 * 5)(5,6,7,8)
bArr = (c_char * 5)('a','b','c')
print bArr[:]
cArray = CArray(iArr, bArr[:])#c_uint8和c_char赋初始值的方式不同,具体还没研究
print cArray.iArray[:]
print cArray.bArray[:] buf = c_buffer("",8)#类似c_char*8
print buf.value
EditBuf(buf,8)#修改buf值,对内存修改
print buf.value
memmove(addressof(buf),byref(c_char('a')),sizeof(c_char))
print buf.value #C库函数调用
fp =fopen("D:\\pythonCallClib.txt","wb+")
fwrite(buf,1,sizeof(buf),fp)#
fseek(fp,3,0)
fwrite(addressof(c_char('')),1,1,fp)
fclose(fp) #sizeof
print "c_uint8 = %d bytes, c_int = %d bytes, buf = %d bytes" %(sizeof(c_uint8), sizeof(c_int), sizeof(buf)) #cast 可以将buf强制转换成我们自定义的类型
buf = create_string_buffer("abc",8)
p = cast(addressof(buf),POINTER(CPoint))
print p.contents.x, p.contents.y

python与C++交互的更多相关文章

  1. Python和Excel交互

    Python和Excel交互 使用的python包为XlsxWriter 下载的链接 https://pypi.python.org/pypi/XlsxWriter 初级的例子: def write_ ...

  2. 【转】Python之系统交互(subprocess)

    [转]Python之系统交互(subprocess) 本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指 ...

  3. Python与Mysql交互

    #转载请联系 在写内容之前,先放一张图,bling- 这张图算是比较详细的表达出了web开发都需要什么.用户访问网页,就是访问服务器的网页文件.这些网页文件由前端工程师编写的.服务器通常用nginx/ ...

  4. Python实现用户交互,显示省市县三级联动的选择

    题目:Python实现用户交互,显示省市县三级联动的选择 定义的字典为: dic = { "江西": { "萍乡": ["安源", &quo ...

  5. 二十、Python与Mysql交互

    先安装一个python与MySQL交互的包:MySQL-python $ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2. ...

  6. Python之系统交互(subprocess)

    本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell ...

  7. Python的用户交互程序及格式化输出

    1.  用户输入 在Python 3 中,用户输入用input()函数即可实现用户交互程序. 例如,我们根据程序提示输入用户名和密码,并且打印输入的信息. 2. 字符串格式化输出 例如,我们根据程序提 ...

  8. Python与RabbitMQ交互

    RabbitMQ 消息队列 成熟的中间件RabbitMQ.ZeroMQ.ActiveMQ等等 RabbitMQ使用erlang语言开发,使用RabbitMQ前要安装erlang语言 RabbitMQ允 ...

  9. python与mysql交互中的各种坑

    开始学python 交互MySQLdb,踩了很多坑 第一个 %d format: a number is required, not str 参照以下博客: https://blog.csdn.net ...

随机推荐

  1. python requests的安装与简单运用

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: python的标准库urllib ...

  2. Design and Analysis of Algorithms_Divide-and-Conquer

    I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...

  3. DOM的概念(1)

    什么是DOM? 通过 JavaScript,您可以重构整个HTML文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript就需要对HTML文档中所有元素进行访问的入口 ...

  4. kali安装谷歌浏览器的方法及启动问题的解决

    在kali上安装谷歌浏览器的时候,遇到了很多问题,经过不懈努力,终于解决,现在把方法总结一下,希望对遇到同样问题的人能有一定帮助.这是给最白的小白参考的,大牛勿喷哈. 说明:我是在kali rolli ...

  5. Java多线程开发系列之二:如何创建多线程

    前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有 ...

  6. [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法

    参考: http://stackoverflow.com/questions/32153318/httpclient-wont-import-in-android-studio http://www. ...

  7. eclipse中 将java项目转换为web项目

    来自:http://jadethao.iteye.com/blog/1331308 eclipse中 将java项目转换为web项目 1.找到项目工作空间目录,打开.project文件,并修改文件,  ...

  8. 数据分析 - 开放街道地图(OpenStreetMap)

    数据分析 - 开放街道地图(OpenStreetMap) Reinhard使用OpenStreetMap的开放地图数据作为本次数据分析的数据源,使用Python进行数据清洗,使用MongoDB进行数据 ...

  9. javascript - 可编辑表格控件 支持全键盘操作(无JS框架)

    项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的, 自己写一个吧! 1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型 2.支持全键盘操作,自定 ...

  10. phpMyAdmin的配置

    好久没写东西了,上来记录一下今天学的一点小东西吧~ 之前搞php开发的时候,一直用的是SQLyog来操作mysql数据库的,但是今天发现sqlyog功能不是很完善,主要是我想修改数据库名,但是sqly ...