2016-02-29 47 views
-1

在我的項目中,我使用module from known bt_manager來解碼sbc音頻流。這個模塊是來自rtpsbc庫的C函數的python包裝。python:類實例無法看到自我屬性

class SBCCodec: 
    def __init__(self, config): 

      import sys 

      try: 
       self.codec = ffi.verify(b'#include "rtpsbc.h"', 
             libraries=[b'rtpsbc'], 
             ext_package=b'rtpsbc') 
      except: 
       print 'Exception:', sys.exc_info()[0] 

      self.config = ffi.new('sbc_t *') 
      self.ts = ffi.new('unsigned int *', 0) 
      self.seq_num = ffi.new('unsigned int *', 0) 
      self._init_sbc_config(config) 
      self.codec.sbc_init(self.config, 0) 

當我嘗試創建SBCCodec類的實例它給了我:

AttributeError: SBCCodec instance has no attribute 'codec' 

你可以在一段代碼我上面貼看到這個屬性。它與ffi-methods(ffi.verify,ffi.new)一起工作。當我在ipython中輸入這些命令時,所有工作都正確無誤。

我錯過了什麼?

+2

那是因爲你可能正在碰到你的'except'子句?並導致'self.codec'永遠不會被設置。你有其他的錯誤信息嗎? – Torxed

+0

當你運行這個程序時,你看到打印的異常嗎? – siphr

+0

是的......它的例外:' –

回答

1

由於@Torxed已經提到了這種情況發生的唯一方法是如果您的try塊中的ffi.verify引發異常。如果發生這種情況,self.codec將不會被初始化。如果發生這種情況,您的代碼不會重新拋出異常並在簡單打印後繼續正常(這不是乾淨的行爲)。最後陳述然後試圖調用self.codec.config.sbc_init,這是它假定self.codec已經intialised,這是在這種特殊情況下不正確的,這就是爲什麼你得到AttibuteError

如果你想創建實例反正無論故障爲ffi.verify在初始化開始定義self.codec =無並在最後陳述中插入檢查如:

if (self.codec != None): 
    self.codec.sbc_init(self.config, 0) 

希望有幫助。

+0

我不能通過它。手動輸入ffi.verify工作正常。有什麼問題? –

+0

問題是'ffi.verify'引發異常。爲什麼?不知道。 –

+0

@r_spb這聽起來像是一個不同的問題,你最初問的是什麼,但沒有更少。如果我不得不猜測,我會說它可能是你手動運行解釋程序的位置和運行腳本的目錄之間的區別。換句話說,在這兩種情況下,工作目錄可能都不相同。 – siphr

相關問題