python和c++能進行有效的互動,c++呼叫python的一些小用法
寫了乙個python指令碼匯入發生異常,可能是編碼問題(如存在中文),
python預設的是ascii
可加上:
#!/usr/bin/python
# -*- coding: utf-8 -*-
參見:定義類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的資料型別:
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時如果更加了解其內在機制,會對使用該語言更有幫助
下面上**:
1 #!/usr/bin/python
2 #-*- coding: utf-8 -*-
3 importos, sys4 from ctypes import *
6 classcpoint(structure):7 _pack_ = 1
8 _fields_ = [('x', c_uint8),9 ('y', c_uint8),10 ]11
12 classcarray(structure):13 _pack_ = 1
14 _fields_ = [('iarray', c_uint8 * 5),15 ('barray', c_char * 5),16 ]17
18 defeditbuf(buf, len):19 tmp =buf20 i =021 val = c_char('7')22 while i <23 memmove>
24 i += 1
26 libc =cdll.msvcrt27 fopen =libc.fopen28 fwrite =libc.fwrite29 fclose =libc.fclose30 fseek =libc.fseek31 fread =libc.fread32 ftell =libc.ftell33 memset =libc.memset34 memcpy =libc.memcpy35
36 if __name__ == '__main__':37 point = cpoint(5,6)38 ppoint =cast(addressof(point),pointer(cpoint))39 print "point.x = %d , point.y = %d" %(point.x, point.y)40 print "ppoint.x = %d , ppoint.y = %d" %(ppoint.contents.x, ppoint.contents.y)41 print point, ppoint.contents#這裡兩個位址值不一樣說明系統為ppoint新申請了乙個point儲存複製的值
43 pointlist = [cpoint(0,1),44 cpoint(2,3)45 ]46 print pointlist[0].x, pointlist[0].y#陣列
48 iarr = (c_uint8 * 5)(5,6,7,8)49 barr = (c_char * 5)('a','b','c')50 printbarr[:]51 carray = carray(iarr, barr[:])#c_uint8和c_char賦初始值的方式不同,具體還沒研究
52 printcarray.iarray[:]53 printcarray.barray[:]54
55 buf = c_buffer("12345",8)#類似c_char*8
56 printbuf.value57 editbuf(buf,8)#修改buf值,對記憶體修改
58 printbuf.value59 memmove(addressof(buf),byref(c_char('a')),sizeof(c_char))60 printbuf.value61
62 #c庫函式呼叫
63 fp =fopen("d:\\pythoncallclib.txt","wb+")64 fwrite(buf,1,sizeof(buf),fp)#77777777
65 fseek(fp,3,0)66 fwrite(addressof(c_char('8')),1,1,fp)67 fclose(fp)68
69 #sizeof
70 print "c_uint8 = %d bytes, c_int = %d bytes, buf = %d bytes" %(sizeof(c_uint8), sizeof(c_int), sizeof(buf))71
72 #cast 可以將buf強制轉換成我們自定義的型別
73 buf = create_string_buffer("abc",8)74 p =cast(addressof(buf),pointer(cpoint))75 printp.contents.x, p.contents.y76
23>
CAD互動繪製批註(網頁版)
js中實現 說明 動態拖放時的繪製事件 functiondynworlddrawcomment pcustomentity,pworlddraw,curpt 動態繪製文字 functiondynworlddrawcomment2 pcustomentity,pworlddraw,curpt 動態繪製...
Python程式設計 與Office互動
首先宣告我的python的版本是3.6的。照著樹上抄有很多錯誤的地方。這也是python用的很不爽的地方,老是更新方法,2.x的python公升到3.x,附帶的模組各種改,解決答案又分布在各個旮旯裡。這裡直接放我執行好的 與excel互動 from tkinter import tk from ti...
mysql與python的互動
conn connect 引數列表 cursor1 conn.cursor mode表示移動的方式 mode的預設值為relative,表示基於當前行移動到value,value為正則向下移動,value為負則向上移動 mode的值為absolute,表示基於第一條資料的位置,第一條資料位置為零 建...