Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Запуск команд, отличных от django, из подкаталога для проекта Django, размещенного на Heroku?

Автор вопроса: Arpit RaiОтветов: 2

Я развернул приложение Django на Heroku. Приложение само по себе работает нормально. Я могу запускать такие команды, как heroku run python project/manage.py syncdbи heroku run python project/manage.py shell, и это работает хорошо.

В моем проекте Django используется библиотека веб-скрейпинга Python под названием Scrapy. Scrapy поставляется с командой под названием scrapy crawl abc, которая помогает мне очищать веб-сайты, которые я определил в приложении scrapy. Когда я запускаю команду scrapy, такую ​​как scrapy crawl spidername, на моем локальном компьютере, приложение может очистить дату и скопировать ее в мою базу данных. Однако, когда я запускаю ту же команду на Heroku в подкаталоге каталога моего проекта heroku run scrapy crawl spidername, ничего не происходит.

Я не вижу в журналах Heroku ничего, что могло бы указать на то, где я ошибаюсь:

2012-01-26T15:45:38+00:00 heroku[run.1]: State changed from created to starting
2012-01-26T15:45:43+00:00 app[run.1]: Awaiting client
2012-01-26T15:45:43+00:00 app[run.1]: Starting process with command `project/spiderMainDir scrapy crawl spidername`
2012-01-26T15:45:44+00:00 heroku[run.1]: State changed from starting to up
2012-01-26T15:45:46+00:00 heroku[run.1]: State changed from up to complete
2012-01-26T15:45:46+00:00 heroku[run.1]: Process exited

Некоторая дополнительная информация:

Мое приложение scrapy вызывает pipelines.py для сохранения очищенных элементов в базе данных. В файле pipelines.py это то, что я написал, чтобы вызвать настройки Django, чтобы я мог импортировать свои модели и сохранять данные в базу данных из приложения scrapy.

import os,sys
PROJECT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(PROJECT_PATH)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

Любые указатели на то, где именно я ошибаюсь? Как мне выполнить команду scrapy на Heroku, чтобы мое приложение могло очистить внешний веб-сайт и сохранить эти данные в базе данных. Разве внешние команды не запускаются в Heroku как - heroku run command?

djangoherokuscrapy

Ответы

Ответ 1 · рейтинг 3 · Arpit Rai

Я отвечаю на свой вопрос, потому что я обнаружил, в чем проблема. Heroku по какой-то причине не смог найти scrapy, когда я выполнил команду из подкаталога, а не из каталога верхнего уровня.

Команда heroku run ... обычно запускается из каталога верхнего уровня. Для моего проекта, в котором используется скрап, мне нужно было перейти в подкаталог и запустить команду scrapy из подкаталога (именно так разработан скрап). Это не работало в Heroku. Поэтому я отправился на вечеринку Heroku, набрав heroku run bash, чтобы посмотреть, что происходит. Когда я запустил команду scrapy из каталога верхнего уровня, Heroku распознал команду, но когда я перешел в подкаталог, он не смог распознать команду scrapy. Я предполагаю, что есть некоторая проблема, связанная с путем. Из подкаталога мне пришлось указать полный путь к scrapy (~/bin/scrapy crawl spidername), чтобы иметь возможность его выполнить.

Чтобы запускать команду scrapy, не заходя каждый раз в Heroku bash вручную, моя работа по решению этой проблемы заключалась в том, что я создал сценарий оболочки, содержащий следующий код, и поместил его в каталог bin моего каталога верхнего уровня и отправил изменения в Heroku. .

бин/scrapy.sh :

#!/usr/bin/env bash
cd ~/project/spiderSubDirectory
~/bin/scrapy $@

После того, как это было сделано, я мог выполнить $ heroku run scrapy.sh crawl spidername из своего локального bash. Я полагаю, что это не лучшее решение, но это работает.

Ответ 2 · Spike

Разве внешние команды не запускаются в Heroku, например, команда heroku run appdir?

На самом деле это heroku run command. Включив туда ваш appdir, вы получите недопустимую команду. Вывод Heroku не дает полезных сообщений об ошибках, когда эти команды терпят неудачу, а вместо этого просто сообщает вам, что команда завершена, что вы и видите. Итак, для вас просто измените команду на что-то вроде:

heroku run scrapy crawl spidername

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы