python與cad互動 python與C 互動

2021-10-12 12:01:26 字數 3502 閱讀 2802

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,表示基於第一條資料的位置,第一條資料位置為零 建...