Python Scrapyd deploy";属性错误:非类型对象没有属性';模块名称'&引用;

Python Scrapyd deploy";属性错误:非类型对象没有属性';模块名称'&引用;,python,scrapy,egg,scrapyd,Python,Scrapy,Egg,Scrapyd,我正在尝试使用scrapy将我的爬虫程序项目部署到scrapyd实例,但调用command会返回以下错误: 服务器响应(200):{“状态”:“错误”,“消息”:“属性错误: “非类型”对象没有“模块名称”属性} 下面是我的setup.py,用于构建部署期间提交的python egg: from setuptools import setup, find_packages setup( name = 'mycrawler', version = '0.1', packa

我正在尝试使用scrapy将我的爬虫程序项目部署到scrapyd实例,但调用command会返回以下错误:

服务器响应(200):{“状态”:“错误”,“消息”:“属性错误: “非类型”对象没有“模块名称”属性}

下面是我的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会抛出类似这样的错误,但无论出于何种原因,该属性实际上为null。我也没有任何带有“module_name”属性的东西,也没有任何试图在我自己的代码中引用它的东西。从scrapy本地运行爬虫程序工作正常,但部署egg则不行。

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

AttributeError: 'NoneType' object has no attribute 'module_name'
这意味着您试图访问某个函数或方法返回的对象中的属性
module\u name
,但返回值是
None
,而不是对象(可能是函数或方法指示发生错误的方式)

检查代码中返回值中引用模块名称的位置

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

最后,它可能是
scrapy
中的一个bug


但是
setuptools

不太可能有问题,这是一个相当晚的答案,但我遇到了同样的问题并找到了解决方案

我的问题可以通过查看
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'
这里,
scraper.settings
是scrapy项目设置文件的Python模块路径。将此更改为反映您的项目布局的,您应该是花花公子


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

您使用的是
scrapyd客户端
包吗?如果是,那么您甚至不需要
setup.py
。我遇到了这个AttributeError,因为我已经有了一个
setup.py
,所以我删除了它。

从python的角度来看,我知道是什么导致了这个错误,但是它不在我的代码中。不,我在哪里引用任何属性“module_name”。而且,正如问题末尾所述,我在本地使用scrapy命令运行它,它运行得很好。足够公平了。。。我很抱歉假设您没有理解错误消息。仅供参考,请检查setuptools源。。。这里没有对“module_name”的引用,所以至少我的最后一句话应该是正确的:)这不需要在每次部署时都将整个项目与scrapyd捆绑在一起吗?如果从非项目根文件夹的另一个位置部署scrapy,它将找不到项目,即在向其部署egg时。您必须复制整个文件夹和所有项目文件。
packages=find_packages(),
entry_points={'scrapy': ['settings = scraper.settings']},