2009-11-21 46 views
1

我這裏的DLL文件的引用: http://speex.org/docs/api/speex-api-reference/group__Codec.htmlPython ctypes&libspeex.dll/libspeex.so; #define,typedef和structs是什麼?

我想知道是,在該列表中,有很多定義。什麼是python等價物,與struct類相同,我用ctypes實現所有這些選項的選項是什麼?類型定義?

我對python比較缺乏經驗,所以請原諒我,如果我不夠我的技能。沒有大學在這裏教它,所以我試圖通過要求&谷歌學習。

現在我只是想基本弄清楚如何與這個speex庫進行接口,所以我至少可以開始使用編碼/解碼功能。但我不確定這3件事情的實施情況。我確信我已經完全掌握了自己的想法,但最終,我總是從頭學到一些新東西。任何人都不介意給我一個簡短的概要?

從我的看法#define在所有實際用途基本上只是foo = bar?
和類:結構SpeexMode將是一個類,它具有所有列出的功能?

或者所有這些已經在編譯的DLL中定義了嗎?如果是這樣,我已經通過我碰到的教程與ctypes做了一個小的dll文件調用。它會像設置環境一樣簡單(將這些變量傳遞到函數中來設置諸如編解碼器質量,調用編碼器,然後使用編碼器之類的東西)

回答

2

要使用結構,你應該用ctypes.Structure來聲明它們,讓Python知道它們。

>>> from ctypes import * 
>>> class POINT(Structure): 
...  _fields_ = [("x", c_int), 
...     ("y", c_int)] 
... 
>>> point = POINT(10, 20) 
>>> print point.x, point.y 
10 20 
>>> point = POINT(y=5) 
>>> print point.x, point.y 
0 5 
>>> POINT(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ValueError: too many initializers 
>>> 

至於定義,它們是包括文件的一部分,通常,所以你只需要自己定義他們在Python代碼,因爲C編譯器甚至不看他們(定義轉換通過預處理器處理它們的值)。

如果您正在尋找從C/C++接口到Python的更自動轉換器,請參閱SWIG。與​​不同,SWIG要求您除使用純Python外還使用C編譯器。

+0

謝謝你的這個例子! - 這真的幫助我理解結構如何工作! - 我不知道你可以通過將它們分配給一個變量然後能夠做[變量]來調用它們。[__ field_] - 這是無效的。 – ThantiK 2009-11-21 20:47:52

+0

另外 - 我真的認爲我更喜歡現在使用ctypes,因爲這意味着稍後我可以拖放我的DLL的新版本,也可以讓dll從可執行文件中解壓縮。稍後,我可以通過發送一個新的dll來「自動更新」我的程序;至少,我希望這是如何去的;) – ThantiK 2009-11-21 20:52:36

0

我至少想出了結構,以及如何基本轉換它們。

基本上你只是做一個類,傳遞它ctypes.Structure,然後讓你的數組字段。

像這樣:

class PASSWD(ctypes.Structure): 
_fields_ = [("name", ctypes.c_char_p), 
      ("passwd", ctypes.c_char_p), 
      ("uid", ctypes.c_int), 
      ("gid", ctypes.c_int), 
      ("change", ctypes.c_long), 
      ("class", ctypes.c_char_p), 
      ("gecos", ctypes.c_char_p), 
      ("dir", ctypes.c_char_p), 
      ("shell", ctypes.c_char_p), 
      ("expire", ctypes.c_long), 
      ("fields", ctypes.c_int) ] 

但我不敢肯定我甚至需要設置這些都放棄了。我很確定他們都是在DLL和setup中定義的,不是嗎?