python代码未在_init__;函数中看到已序列化的类变量

python代码未在_init__;函数中看到已序列化的类变量,python,spynner,Python,Spynner,我在使用spynner时遇到了一个奇怪的错误,尽管这个问题是一般性的。Spynner是python的有状态web浏览器模块。当它工作时,它工作得很好,但我几乎每次跑步都会失败-- 这里的问题是它的错误,不让我继续 查看spynner的代码,我发现cookies变量实际上是在Browser类的\uuuu init\uuu()函数中初始化的,如下所示: self.cookies = [] 现在在失败时,它实际上是说\uuuu init\uuuu()没有运行,因为它没有看到cookies变量。我不明

我在使用spynner时遇到了一个奇怪的错误,尽管这个问题是一般性的。Spynner是python的有状态web浏览器模块。当它工作时,它工作得很好,但我几乎每次跑步都会失败--

这里的问题是它的错误,不让我继续

查看spynner的代码,我发现cookies变量实际上是在Browser类的
\uuuu init\uuu()
函数中初始化的,如下所示:

self.cookies = []
现在在失败时,它实际上是说
\uuuu init\uuuu()
没有运行,因为它没有看到cookies变量。我不明白这怎么可能。如果不局限于Spyner模块,有人可以大胆猜测python对象如何会出现这样的错误

编辑:我肯定会把我的代码粘贴在这里,除非它不是全部放在一个地方让我紧凑地显示出来。我应该早点做,但这里是整体结构,以及我如何实例化和使用Spyner

# 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没有正确处理?我还不知道。我需要提到的是,我对python还比较陌生


我注意到,当我用say“”运行上面的代码时,每隔一次我就会得到segfault

do_stuff_和_save_url_data()的代码块不使用引用
self

那么此函数的执行不依赖于
驱动程序

save\u url\u to_disk()
的代码块也不使用引用
self

然后,第二个函数的执行不依赖于对象
fileObj

只有
get_data()
的代码块使用引用
self
,更准确地说,使用引用
self.browser

因此,它的执行和结果取决于类
C
中实例
urlObj
的属性
browser
。该属性实际上是
spynner.browser
类的名为
browser
的浏览器实例

最后,您只需使用
spynner.Browser().html
输出的数据就可以“使用html进行工作”。创建
驱动程序
文件对象
在任何方面都不是强制性的

另一点是
执行指令
driver.do\u stuff\u和\u save\u url\u data(url)
时,
方法
driver.do\u stuff\u和\u save\u url\u data(url)
首先创建,然后执行,最后“销毁”(或者更准确地说,忘记了RAM中的某个地方),因为它没有分配给任何标识符

然后标识符
fileObj
,它是属于函数
驱动程序的本地名称空间的标识符。do_stuff_和_save_url_data()
,也将丢失,这意味着类
B
的实例fileObj也将丢失,以供以后使用,因为它没有更多的指定标识符处于活动状态

这与
将url保存到磁盘()相同。

创建并执行方法
fileObj.save\u url\u to\u disk(url)
后,类
C
的对象urlObj将丢失,该对象包含浏览器实例(由
spynner.browser()
创建的对象):创建的浏览器及其所有数据将丢失

我想知道这是否是因为每次执行
do\u stuff\u和
save\u url\u to\u disk()
后浏览器实例都会被破坏,所以cookie信息不会在其他调用之前被破坏

因此,在我看来,您的代码只在类
A
B
的两个定义中嵌入了两个函数,它们被视为函数,而不是方法

1/我认为这不是一个好的编码模式。当只需要普通函数时,它们必须在任何类之外编写

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

您会告诉我,您希望这些函数与由
spynny.browser()

这就是为什么我认为它们不能像现在那样是嵌入在类中的函数,而是连接到浏览器稳定实例的真实方法。对象的目标就是将数据和处理数据的工具保持在同一名称空间中

-

综上所述,我将亲自写下:

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)

但我不确定是否完全理解了你的所有考虑,我警告说,在阅读你的帖子之前,我并不了解spynner。相对于你真正的问题,我所写的一切可能都是愚蠢的。请密切关注我的帖子。

你怎么给Spynner打电话?您是否正在对浏览器进行子类化?分段错误?不管你做了什么,那都不应该发生。你能给我们看看你的代码吗?是否有任何代码在任何时候执行自我删除操作?@user2357112:这在回溯之后发生。是的,这也令人担忧,但可能与此无关。@MartijnPieters:可能是扩展不稳定的迹象,但在这种情况下,解决方案可能是切换版本或放弃扩展。文件路径中的
dev0
位看起来可能表示开发版本;如果是这样,不使用开发版本可能是一种尝试。
# xvfb-run python myfile.py
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)