2015-06-15 4 views
2

Я пытаюсь выполнить команду пользовательского проекта Scrapy для запуска пауков. Я нашел Register commands via setup.py entry points и сделал следующее:Scrapy Custom Project Command: «ImportError: No module named commands»

  1. mkdir commands

  2. cd commands

  3. Созданный файл команды crawlall.py:

    from scrapy.commands import ScrapyCommand 
    from scrapy.utils.project import get_project_settings 
    from scrapy.crawler import Crawler 
    
    class Command(ScrapyCommand): 
    
        requires_project = True 
    
        def syntax(self): 
         return '[options]' 
    
        def short_desc(self): 
         return 'Runs all of the spiders' 
    
        def run(self, args, opts): 
         settings = get_project_settings() 
    
         for spider_name in self.crawler.spiders.list(): 
          crawler = Crawler(settings) 
          crawler.configure() 
          spider = crawler.spiders.create(spider_name) 
          crawler.crawl(spider) 
          crawler.start() 
    
         self.crawler.start() 
    
  4. Добавлено COMMANDS_MODULE = 'myprojectname.commands' к settings.py.

  5. Создал setup.py:

    from setuptools import setup, find_packages 
    
    setup(name='scrapy-mymodule', 
        entry_points={ 
        'scrapy.commands': [ 
         'crawlall=cnblogs.commands:crawlall', 
        ], 
        }, 
    ) 
    
  6. Ран команду проекта с scrapy crawlall, который бросил следующую ошибку:

    Traceback (most recent call last): 
        File "/usr/local/bin/scrapy", line 9, in <module> 
        load_entry_point('Scrapy==1.0.0rc2', 'console_scripts', 'scrapy')() 
        File "/usr/local/lib/python2.7/site-packages/Scrapy-1.0.0rc2-py2.7.egg/scrapy/cmdline.py", line 122, in execute 
        cmds = _get_commands_dict(settings, inproject) 
        File "/usr/local/lib/python2.7/site-packages/Scrapy-1.0.0rc2-py2.7.egg/scrapy/cmdline.py", line 50, in _get_commands_dict 
        cmds.update(_get_commands_from_module(cmds_module, inproject)) 
        File "/usr/local/lib/python2.7/site-packages/Scrapy-1.0.0rc2-py2.7.egg/scrapy/cmdline.py", line 29, in _get_commands_from_module 
        for cmd in _iter_command_classes(module): 
        File "/usr/local/lib/python2.7/site-packages/Scrapy-1.0.0rc2-py2.7.egg/scrapy/cmdline.py", line 20, in _iter_command_classes 
        for module in walk_modules(module_name): 
        File "/usr/local/lib/python2.7/site-packages/Scrapy-1.0.0rc2-py2.7.egg/scrapy/utils/misc.py", line 63, in walk_modules 
        mod = import_module(path) 
        File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module 
        __import__(name) 
    ImportError: No module named commands 
    

Что я должен делать? Где моя ошибка?

ответ

2

Для того, чтобы модуль обнаружить, добавьте __init__.py файл в каталоге commands:

> pwd    # make sure that you are in commands directory 
.../commands/ 

> touch __init__.py # create __init__.py 

Смотреть подробнее в другой SO нить: What is __init__.py for?

+0

Да, создайте ** __ init __. Py ** файл внутри каталога команд. спасибо – Nabin

0

Каталог с помощью сценария Python делает не импортируемый модуль: вам необходимо добавить файл __init__.py в каталог commands, так как Python documentation on modules and packages поясняет:

The __init__.py files are required to make Python treat the directories as containing packages....

Файл __init__.py может быть пустым.

Кроме того, commands должен находиться в директории на sys.path, если это уже не для Python, чтобы найти его, как и вышеупомянутая документация далее поясняет:

When importing [a] package, Python searches through the directories on sys.path looking for the package subdirectory.

Следующий Python сниппет будет отображать sys.path:

import sys 
sys.path 

И наконец, прочитайте particularly relevant SO answer в теме, на которую Джон направил вас для получения дополнительной информации.

Смежные вопросы