从Heroku上托管的Django项目的子目录运行非django命令?

时间:2012-01-26 16:11:10

标签: django heroku scrapy

我在Heroku上部署了一个Django应用程序。应用程序本身工作正常。我可以运行heroku run python project/manage.py syncdbheroku run python project/manage.py shell等命令,但效果很好。

我的Django项目使用名为Scrapy的Python Web抓取库。 Scrapy附带一个名为scrapy crawl abc的命令,它可以帮助我抓取我在scrapy应用程序中定义的网站。当我在本地计算机上运行sc scrapy crawl spidername等scrapy命令时,应用程序可以抓取日期并将其复制到我的数据库中。但是,当我在项目目录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应用程序调用{​​{1}}将已删除的项目保存到数据库中。在pipelines.py文件中,这是我编写的用于调用Django设置的内容,以便我可以导入模型并将数据从scrapy应用程序保存到数据库。

pipelines.py

关于我哪里错误的任何指示?如何在Heroku上执行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

2 个答案:

答案 0 :(得分: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。

bin / scrapy.sh:

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

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

答案 1 :(得分:0)

  

外部命令不是像Heroku一样运行的方式 - heroku运行   appdir命令?

实际上是heroku run command。通过在其中包含您的appdir,它会导致命令无效。当这些命令失败时,Heroku的输出不会提供有用的错误消息,而只是告诉您命令已完成,这就是您所看到的。所以对你来说,只需将命令更改为:

heroku run scrapy crawl spidername