class?block():
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),鄱陽網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:鄱陽等地區(qū)。鄱陽做網(wǎng)站價格咨詢:028-86922220
def?__init__(self):
self.x=0
self.y=0
self.z=0
point=[block()?for?i?in?range(100)]
況如下:
打算從Python發(fā)一個TCP數(shù)據(jù)包給遠(yuǎn)程服務(wù)器,數(shù)據(jù)的主體是一個C語言的 struct (較大,size 為1402)。由于這個struct太復(fù)雜,故不打算在python 處對其重新定義,目前的想法是用python調(diào)用一個C語言的模塊,在這個模塊中定義這個Struct,并設(shè)置好數(shù)據(jù)后,將其struct傳回python中,再打包傳送服務(wù)器。
但是不知道如何將這個struct 變量從C語言 傳入Python中。嘗試用Py_BuildValue函數(shù),以Py_BuildValue("P",interface_setup) //interface_setup為結(jié)構(gòu)體變量
傳遞,
但是幾次都得到運(yùn)行時錯誤:
SystemError: bad format char passed to PyBuildVaule。
Python中沒有專門定義結(jié)構(gòu)體的方法,但可以使用class標(biāo)記定義類來代替結(jié)構(gòu)體,
其成員可以在構(gòu)造函數(shù)__init__中定義,具體方法如下。
復(fù)制代碼代碼如下:
class item:
def __init__(self):
self.name = '' # 名稱
self.size = 10 # 尺寸
self.list = [] # 列表
a = item() # 定義結(jié)構(gòu)對象
a.name = 'cup'
a.size = 8
a.list.append('water')
閟truct就可以使用結(jié)構(gòu)體了:
import struct
生成一個結(jié)構(gòu)體實(shí)例:
data = struct.pack( 'format_string', struct_menber_1, struct_menber_2, ... )
其中的format_string用來指定結(jié)構(gòu)體的格式(指明該結(jié)構(gòu)體在C中的定義),由兩部分組成:
首先是一個可選的特殊字符,用來指明字節(jié)序、數(shù)據(jù)類型大小和對齊方式:
@: native order, size alignment (default)
=: native order, std. size alignment
: little-endian, std. size alignment
: big-endian, std. size alignment
!: same as
然后是指明結(jié)構(gòu)體定義的部分:
The remaining chars indicate types of args and must match exactly;
these can be preceded by a decimal repeat count:
x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
h:short; H:unsigned short; i:int; I:unsigned int;
l:long; L:unsigned long; f:float; d:double.
Special cases (preceding decimal count indicates length):
s:string (array of char); p: pascal string (with count byte).
Special case (only available in native format):
P:an integer type that is wide enough to hold a pointer.
Special case (not in native mode unless 'long long' in platform C):
q:long long; Q:unsigned long long
Whitespace between formats is ignored.
如果struct模塊的函數(shù)出錯,將產(chǎn)生struct.error異常。
在封裝的代碼間傳遞指針你要確保他們運(yùn)行在相同的地址空間里,還要保證指針指向的內(nèi)存的生存期是安全的,否則這種思路就是錯誤的。實(shí)現(xiàn)方法舉例如下:
1、定義了C
結(jié)構(gòu)體和函數(shù)如下
typedef
struct
NameAge
{
char
name[20];
int
age;
}NameAge
,
*NameAgePointer;
void
test(NameAgePointer
p)
//
接收結(jié)構(gòu)體指針
{
//
do
something
with
p...
}
2、python定義結(jié)構(gòu)體如下
#python中結(jié)構(gòu)體定義
class
PyStruct():
def
__init__(self,
name,
age):
self.name
=
name
self.age
=
age
fred
=
PyStruct("fred",
5)
3、假設(shè)把第1步里的test封裝成example模塊,python導(dǎo)入example(既然你都會swig了,這個過程就不啰嗦了)
import
example
example.test(pointer(fred))
以上是基本思路,因?yàn)榇罱ㄩ_發(fā)環(huán)境和過程比較繁雜,沒有驗(yàn)證過,但是應(yīng)該沒有大問題