2012-01-26 46 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',並且它不起作用。我添加了解決工作問題的答案。 –