2013-12-11 14 views
1

我遇到spynner出现奇怪的错误,但问题是通用的。 Spynner是python的有状态的web浏览器模块。Python代码在__init __()函数中没有看到iniialized的类变量

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/spynner-2.16.dev0-py2.7.egg/spynner/browser.py", line 1651, in createRequest 
    self.cookies, 
AttributeError: 'Browser' object has no attribute 'cookies' 
Segmentation fault (core dumped) 

这里的问题是其与段错误不是让我继续 - 当它的工作原理,但我几乎每次运行时我得到一个失败说这句话的,它工作正常。

望着用于spynner代码中,我看到,饼干变量其实在__init__()函数初始化浏览器类是这样的:

self.cookies = [] 

现在失败的真正要说的是,__init__()不运行因为它没有看到cookies变量。我不明白这怎么可能。没有限制到spynner模块可以有人冒险猜测如何python对象可能会失败,像这样的错误?

编辑:我绝对会在这里粘贴我的代码,除了它不是全部在一个地方为我紧凑地显示它。我应该早点完成,但这里是整体结构以及我如何实例化和使用spynner。

# helper class to get url data 
class C: 
    def __init__(self): 
     self.browser = spynner.Browser() 

    def get_data(self, url): 
     try: 
      self.browser.load(url) 
      return self.browser.html 
     except: 
      raise 

# class that does other stuff among saving url data to disk 
class B: 
    def save_url_to_disk(self, url): 
     urlObj = C() 
     html = urlObj.get_data(url) 
     # do stuff with html 


# class that drives everything 
class A: 
    def do_stuff_and_save_url_data(self, url): 
     fileObj = B() 
     fileObj.save_url_to_disk(url) 

driver = A() 
# call this function for multiple URLs. 
driver.do_stuff_and_save_url_data(url) 

我运行事情是这样的---

# xvfb-run python myfile.py 

的段错误可能是别的东西我做的。可能是因为我使用的xvfb而导致处理不当?我还不知道。我需要提到的是,我对python比较陌生。

我注意到,当我运行上面的代码并说'http://www.google.com'时,我每隔一段时间都会收到段错误。

+0

你打电话给Spynner?你是继承浏览器? –

+0

分割错误?无论你做什么,都不应该发生。 – user2357112

+0

你能告诉我们你的代码吗?任何代码在任何时候都会执行'del self.cookies'吗? –

回答

0

do_stuff_and_save_url_data()代码块不使用参考self
则该函数的执行不依赖于driver

save_url_to_disk()码块还没有使用参考self
然后该第二功能的执行不依赖于对象fileObj上。

只有get_data()码块使用参考self,并且更精确的基准self.browser
所以其执行和结果依赖于实例urlObjC类属性browser。该属性实际上是spynner.Browser类中名为browser的浏览器实例。

最后,你“做东西与html”只有数据输出spynner.Browser().html。以任何方式创建driverfileObj都不是强制性的。

另一点是,
当指令driver.do_stuff_and_save_url_data(url)执行 ,
第一次创建driver.do_stuff_and_save_url_data(url)的方法中,然后被执行,最后“破坏”(或更精确地在RAM某处忘记),因为它没有被分配给任何标识符。

然后标识符fileObj,其标识符属于功能driver.do_stuff_and_save_url_data()的本地名称空间中,失去了太多,这意味着该实例FileObj文件B类的也失去了叵使用,因为它已不再分配的标识符活。

这对save_url_to_disk()相同的:
方法fileObj.save_url_to_disk(url)的创建和执行后,对象C类的urlObj,其中包含浏览器(由spynner.Browser()创建的对象)的一个实例,将丢失:所创建的浏览器及其所有数据都将丢失。

我不知道这是不是因为在每次执行do_stuff_and_save_url_data()save_url_to_disk()之后浏览器实例被破坏导致cookies信息在别处被调用之前不会被销毁。

所以,在我看来,你的代码只在类别AB的两个定义中嵌入了两个函数,它们被用作被视为函数,而不是方法。

1 /我不认为这是一个很好的编码模式。当一个人只需要简单的功能时,他们必须写在任何课程之外。

2问题是,如果操作是由函数触发的,每次激活这些函数时都会创建一个新的浏览器,即使它们具有方法的功能。

你会说我希望这些函数能够与由spynny.Browser()定义的浏览器提供的数据一起工作。
这就是为什么我认为它们不能像现在一样被嵌入类中的函数,而是附加到浏览器的稳定实例的真实方法。这就是对象在同一个命名空间中保存数据和处理数据的工具的目的。

-

所有这一切说,我会写personnally:

class C(spynner.Browser): 
    def __init__(self): 
     spynner.Browser.__init__(self) 

    def get_data(self, url): 
     try: 
      self.html = self.load(url).html 
     except: 
      raise 

    # method that does other stuff among saving url data to disk 
    def save_url_to_disk(self, url): 
     get_data(url) 
     # do stuff with self.html 

    # method that drives everything 
    def do_stuff_and_save_url_data(self, url): 
     self.save_url_to_disk(url) 


driver = C() 
driver.do_stuff_and_save_url_data(url) 

但我不知道有很好undesrtood所有的考虑,我警告,我没有读您的文章之前知道spynner。我写的所有内容都可能相对于你真正的问题而言是愚蠢的。请批评我的帖子,请。