【问题标题】:Scrapyd deploy "Attribute Error: NoneType object has no attribute 'module_name'"Scrapyd 部署“属性错误:NoneType 对象没有属性‘module_name’”
【发布时间】:2013-01-16 01:59:06
【问题描述】:

我正在尝试使用 scrapy 将我的爬虫项目部署到一个 scrapyd 实例,但调用命令返回以下错误:

服务器响应 (200): {"status": "error", "message": "AttributeError: 'NoneType' 对象没有属性 'module_name'"}

这是我的 setup.py,用于构建在部署期间提交的 python egg:

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 会引发这样的错误。我也没有任何带有“module_name”属性的东西或任何试图在我自己的代码中引用它的东西。从scrapy本地运行爬虫就可以了,但是部署egg就不行了。

【问题讨论】:

    标签: python scrapy egg scrapyd


    【解决方案1】:

    你在使用scrapyd-client 包吗?如果是,那么您甚至不需要setup.py。我遇到了那个AttributeError,因为我已经有一个setup.py,所以我删除了。

    【讨论】:

      【解决方案2】:

      一个相当晚的答案,但我遇到了同样的问题并找到了解决方案。

      通过查看来自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,并检查对 setup 的调用是否包含以下行:

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

      这里,scraper.settings 是 scrapy 项目设置文件的 Python 模块路径。将此更改为反映您的项目布局的一个,您应该是花花公子..

      ..如果没有,这里的关键是检查来自scrapyd 的输出(启用调试允许您在服务器响应中看到)以找到解决方案。

      【讨论】:

      • 每次部署时不需要用scrapyd捆绑整个项目吗?如果从不是项目根文件夹的另一个位置部署scrapy,它将找不到项目,即在向其部署鸡蛋时。您必须将整个文件夹与所有项目文件一起复制。
      【解决方案3】:

      这是一个编码错误,可能在您的mycrawler 模块中:

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

      这意味着您正在尝试访问某个函数或方法返回的对象中的属性module_name,但返回值是None,而不是一个对象(可能是函数或方法返回的方式)方法表示发生了错误)。

      检查您的代码以查找您在返回值中引用 module_name 名称的地方。

      或者可能是scrapy 要求您定义并传递给它的对象之一必须定义module_name 属性,而您忘记这样做了。

      最后,这可能是scrapy 中的一个错误。

      setuptools 不太可能有问题。

      【讨论】:

      • 从 python 的角度来看,我知道实际导致错误的原因,但它不在我的代码中。没有我在哪里引用任何属性'module_name'。而且,正如问题末尾所述,我只在本地使用scrapy命令运行它,它工作得很好。
      • 很公平......假设您没有理解错误消息,我很抱歉。
      • 作为参考,刚刚检查了 setuptools 源......那里没有提到“module_name”,所以至少我的最后一句话应该成立:)
      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 2021-02-17
      • 2023-02-17
      • 2017-07-23
      • 2018-05-02
      • 2019-03-17
      • 1970-01-01
      • 2022-11-29
      相关资源
      最近更新 更多