2013-01-31 462 views
0

我試圖使用scrapy部署我的履帶式工程到scrapyd實例,但調用返回表彰以下錯誤:Scrapyd部署「屬性錯誤:NoneType對象有沒有屬性‘MODULE_NAME’」

Server response (200): {"status": "error", "message": "AttributeError: 'NoneType' object has no attribute 'module_name'"}

這裏是我的setup.py打造部署期間提交的蟒蛇蛋:

from setuptools import setup, find_packages 

setup(
    name = 'mycrawler', 
    version = '0.1', 
    packages = find_packages(), 
    install_requires = [ 
     'scrapy', 
     'PyMongo', 
      'simplejson', 
      'queue' 
    ] 
) 

我scrapy.cfg:

[settings] 
default = mycrawler.settings 

[deploy:scrapyd_home_vm] 
url = http://192.168.1.2:6800/ 
project = mycrawler 

[deploy:scrapyd_local_vm] 
url = http://192.168.38.131:6800/ 
project = mycrawler 

我覺得這與蛋的建造方式有關,但我不確定。我知道當你訪問一個應該是一個對象的屬性時,python會拋出這樣的錯誤,但是無論出於何種原因,它實際上都是null。我也沒有任何關於「module_name」屬性或任何試圖在我自己的代碼中引用它的東西。從本地scrapy運行爬蟲工作得很好,但部署egg並不能。

回答

-1

這是一個編碼錯誤,可能在你mycrawler模塊:

AttributeError: 'NoneType' object has no attribute 'module_name' 

這意味着您試圖訪問屬性module_name中,是由一些函數或方法返回一個對象,但是返回值是而不是作爲對象(可能是函數或方法指示發生錯誤的方式)。

檢查您的代碼,查找返回值中引用module_name名稱的地方。

或者它可能是scrapy要求您定義並傳遞給它的對象之一必須已定義module_name屬性,並且您已忘記這樣做。

最後,它可能是scrapy中的一個錯誤。

但是它不太可能成爲setuptools的問題。

+0

我知道是什麼導致從python的角度來看,但它不是在我的代碼。沒有我在哪裏引用任何屬性'module_name'。另外,正如問題的末尾所述,我已經在本地使用scrapy命令來運行它,並且它工作得很好。 –

+0

夠公平的......假設你還沒有理解錯誤信息,我的感覺很糟糕。 – isedev

+0

沒關係。我應該提到這一點。 –

5

一個相當晚的答案,但我遇到了同樣的問題,並找到了解決方案。

對我來說,問題可以通過查看回溯從scrapyd發出自己找到:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/usr/lib/python2.7/runpy.py", line 72, in _run_code 
    exec code in run_globals 
    File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 39, in <module> 
    main() 
    File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 34, in main 
    with project_environment(project): 
    File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__ 
    return self.gen.next() 
    File "/home/vagrant/venv/lib/python2.7/site-packages/scrapyd/runner.py", line 22, in project_environment 
    activate_egg(eggpath) 
    File "/home/vagrant/venv/local/lib/python2.7/site-packages/scrapyd/eggutils.py", line 13, in activate_egg 
    settings_module = d.get_entry_info('scrapy', 'settings').module_name 

AttributeError: 'NoneType' object has no attribute 'module_name' 

正如你可以看到它正試圖加載scrapy項目的settings_module; module_name屬性不存在,因爲d.get_entry_info正在返回None對象。

解決的辦法是檢查你的setup.py正被用來產生卵子並檢查呼叫設置包含以下行:

packages=find_packages(), 
entry_points={'scrapy': ['settings = scraper.settings']}, 

這裏,scraper.settings是Python模塊路徑scrapy項目設置文件。改變這個反映你的項目佈局,你應該是花花公子。

..如果不是,這裏的關鍵是檢查從scrapyd(啓用調試允許你看到,在服務器響應)的輸出找到解決方案。

相關問題