2016-02-29 56 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

相关问题