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