2013-12-11 43 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。我寫的所有內容都可能相對於你真正的問題而言是愚蠢的。請批評我的帖子,請。