我在Heroku上部署了一个Django应用程序。应用程序本身工作正常。我可以运行heroku run python project/manage.py syncdb
和heroku 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
?
答案 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