2010-03-15 51 views
6

我想在某些獨立的屏幕抓取腳本中使用Django ORM。我知道這個問題以前曾被問過,但我無法找到解決我的特殊問題的好方法。在獨立腳本中使用Django ORM(再次)

我有一個定義模型的Django項目。我想要做的就是在我的scraping腳本中使用這些模型和ORM。我的目錄結構是這樣的:

project 
    scrape 
     #scraping scripts 
     ... 
     test.py 
    web 
     django_project 
      settings.py 
      ... 
      #Django files 

我試圖做的project/scrape/test.py如下:

print os.path.join(os.path.abspath('..'), 'web', 'django_project') 
sys.path.append(os.path.join(os.path.abspath('..'), 'web', 'django_project')) 
print sys.path 
print "-------" 
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings' 
#print os.environ 
from django_project.myapp.models import MyModel 
print MyModel.objects.count() 

不過,我得到一個ImportError,當我嘗試運行test.py:

Traceback (most recent call last): 
    File "test.py", line 12, in <module> 
    from django_project.myapp.models import MyModel 
ImportError: No module named django_project.myapp.models 

我發現這個問題的一個解決方案是創建一個符號鏈接到../web/govcheck在scrape文件夾中:

:scrape rmanocha$ ln -s ../web/govcheck ./govcheck 

用這個,我可以運行test.py就好了。然而,這看起來像一個黑客,更重要的是,不是很便攜(我將不得不在我運行此代碼的任何地方創建這個符號鏈接)。

所以,我想知道如果有人有任何更好的解決方案,我的問題?

回答

2

你確定它不應該是:

sys.path.append(os.path.join(os.path.abspath('..'), 'web')) 

此外,還要確保在project/web/django_project有一個__init__.py文件(空是罰款)。

P.S.我建議喂os.path.join的輸出到os.path.abspath而不是其他方式。

+0

謝謝 - 工程。 – 2010-03-15 04:03:50

7

找到一種簡單的方法來重新使用現有的Django應用程序的控制檯腳本設置:

from django.core.management import setup_environ 

import settings 
setup_environ(settings) 

from myapp.models import Object 

for o in Object.objects.all(): 
    print o 
+1

請注意,自從Django 1.4開始,setup_environ函數已被棄用。請參閱發行說明:https://docs.djangoproject.com/zh-CN/dev/releases/1.4/#django-core-management-setup-environ – 2013-10-30 15:49:48

+0

此外,請勿「導入設置」。做'從django.conf導入設置'。這將正確定位設置文件,即使它不在Python路徑中。 – 2014-03-19 02:57:55

0

我知道這個問題是六歲,但這種替代可能會吸引別人搜索這個話題。假設Django的manage.pyproject/,並假設main()是腳本的入口點,然後讓Django的採取應變:

./manage.py shell -c 'from scrape.test import main; main()'