2012-01-26 35 views
2

我在Heroku上部署了一个Django应用程序。应用程序本身工作正常。我可以运行诸如heroku run python project/manage.py syncdbheroku run python project/manage.py shell之类的命令,并且这种方式很好。从Heroku上托管的Django项目的子目录运行非django命令?

我的Django项目使用名为Scrapy的Python网页抓取库。 Scrapy带有一个名为scrapy crawl abc的命令,它帮助我抓取我在scrapy应用程序中定义的网站。当我在本地机器上运行scrapy命令(例如scrapy crawl spidername)时,应用程序能够将日期和日期复制到我的数据库中。但是,当我在我的项目目录heroku run scrapy crawl spidername的子目录下的Heroku上运行相同的命令时,没有任何反应。

我没有看到在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' 

任何指向我到底错在哪里的指针?如何在Heroku上执行scrapy命令,以便我的应用程序可以抓取外部网站并将该数据保存到数据库。外部命令在Heroku中的运行方式不像 - heroku run command

回答

3

我在回答我自己的问题,因为我发现了问题所在。 Heroku出于某种原因无法在从子目录执行命令时找到scrapy而不是顶层目录。

命令heroku run ...通常从顶层目录运行。对于我使用scrapy的项目,我被要求进入一个子目录并从子目录运行scrapy命令(这是scrapy的设计原理)。这在Heroku中不起作用。所以我通过输入heroku run bash去看Heroku bash,看看发生了什么。当我从顶层目录运行scrapy命令时,Heroku识别出该命令,但是当我去到一个子目录时,它无法识别命令scrapy。我想有一些与路径有关的问题。从子目录中,我必须指定完成路径scrapy~/bin/scrapy crawl spidername)才能执行它。

要运行scrapy命令而不必每次手动进入Heroku bash,我的解决方法是创建一个包含以下代码的shell脚本,并将其放在我的顶级目录的bin目录下并推送Heroku的变化。

斌/ scrapy.sh:

#!/usr/bin/env bash 
cd ~/project/spiderSubDirectory 
~/bin/scrapy [email protected] 

之后做,我可以从当地的bash执行$ heroku run scrapy.sh crawl spidername。我认为它不是最好的解决方案,但这是有效的。

0

是不是外部命令在Heroku上运行一样的方式 - Heroku的运行 APPDIR命令?

它实际上是heroku run command。通过将你的appdir包含在那里,导致了一个无效的命令。当这些命令失败时,Heroku的输出不会提供有用的错误消息,而只是告诉你命令完成了,这就是你所看到的。所以对你而言,只需将命令改为如下所示:

heroku run scrapy crawl spidername 
+0

嗨。很抱歉,问题是从子目录运行'heroku run'。我的问题并不十分清楚,因为我曾尝试从子目录运行'heroku run scrapy crawl spidername',并且它不起作用。我添加了解决工作问题的答案。 –