2012-03-22 69 views
0

嗯,这是相当苛刻的问题,“不同的解决方案”是不是在目前的情况下获得的,所以请尽量帮我解决这个问题,而不是回避它=)Django的独立脚本

因此,有一个django项目,它使用buildout但不使用virtualenv(因为我们在安装字体时遇到问题)。项目工作正常。现在我试图实现Django独立脚本,我认为我有一个路径问题。首先我想介绍一下base dir的结构。

roman% ls 
bootstrap.py  
cgi-bin    
eggs   
parts 
bin 
buildout.cfg 
develop-eggs 
lib 
project 

bin 
|-- buildout 
`-- django 


roman% cd eggs 
roman% ls -h 
DateUtils-0.5.1-py2.7.egg    oauth2-1.5.211-py2.7.egg 
Django-1.3.1-py2.7.egg     pisa-3.0.33-py2.7.egg 
South-0.7.3-py2.7.egg     pyBarcode-0.6-py2.7.egg 
collective.recipe.omelette-0.12-py2.7.egg  pycrypto-2.5-py2.7-freebsd-8.2-RELEASE-amd64.egg 
django_mptt-0.5.2-py2.7.egg    pygeoip-0.2.2-py2.7.egg 
django_pagination-1.0.7-py2.7.egg   python_dateutil-2.0-py2.7.egg 
django_registration-0.7-py2.7.egg   python_openid-2.2.5-py2.7.egg 
django_rosetta-0.6.5-py2.7.egg    pytz-2012b-py2.7.egg 
django_social_auth-0.6.7-py2.7.egg   setuptools-0.6c12dev_r88846-py2.7.egg 
django_staging-0.1.0_alpha-py2.7.egg   six-1.1.0-py2.7.egg 
django_tagging-0.3.1-py2.7.egg    sorl_thumbnail-11.12-py2.7.egg 
django_threaded_multihost-1.4_1-py2.7.egg  unicodecsv-0.9.0-py2.7.egg 
djangorecipe-1.1.2-py2.7.egg    xlwt-0.7.3-py2.7.egg 
flup-1.0.3.dev_20110405-py2.7.egg   zc.buildout-1.5.2-py2.7.egg 
html5lib-0.95-py2.7.egg     zc.recipe.egg-1.3.2-py2.7.egg 
httplib2-0.7.4-py2.7.egg 

roman% tree parts 
parts 
|-- buildout 
| |-- site.py 
| |-- site.pyc 
| |-- site.pyo 
| |-- sitecustomize.py 
| |-- sitecustomize.pyc 
| `-- sitecustomize.pyo 
`-- omelette 
    `-- django -> /srv/xxx/eggs/Django-1.3.1-py2.7.egg/django 

3 directories, 6 files 

独立脚本是在/ srv/XXX /项目/应用/ DIR

现在终于脚本:

import os 
import sys 
import time 
import pickle 
from datetime import datetime 
from pprint import pprint 

sys.path.append(os.path.abspath('..')) 
sys.path.append(os.path.abspath(os.path.join('..', '..'))) # Project dir 
sys.path.append(os.path.abspath(os.path.join('..', '..', 'parts', 'omelette'))) 
sys.path.append(os.path.abspath(os.path.join('..', '..', 'eggs'))) 

from django.core.management import setup_environ 
import settings                             

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.site_nl' 

from django.template.loader import render_to_string 

如果您运行此脚本,一切正常,除了最后一行。我甚至可以导入模型。无论如何,当我在ipython中执行此操作时,可以通过自动完成导航到django.template,但是所有更深层次的内容,例如django.template.loader/base/whatever都不起作用。此脚本的最后一行给出此错误

roman% python email.py 
Traceback (most recent call last): 
    File "email.py", line 34, in <module> 
    from django.template.loader import render_to_string 
    File "/srv/travelbird/parts/omelette/django/template/__init__.py", line 53, in <module> 
    from django.template.base import (ALLOWED_VARIABLE_CHARS, BLOCK_TAG_END, 
    File "/srv/travelbird/parts/omelette/django/template/base.py", line 6, in <module> 
    from django.template.context import Context, RequestContext, ContextPopException 
    File "/srv/travelbird/parts/omelette/django/template/context.py", line 4, in <module> 
    from django.http import HttpRequest 
    File "/srv/travelbird/parts/omelette/django/http/__init__.py", line 122, in <module> 
    from django.utils.http import cookie_date 
    File "/srv/travelbird/parts/omelette/django/utils/http.py", line 7, in <module> 
    from email.Utils import formatdate 
    File "/srv/travelbird/travelbird/draaideur/email.py", line 34, in <module> 
    from django.template.loader import render_to_string 
    File "/srv/travelbird/parts/omelette/django/template/loader.py", line 29, in <module> 
    from django.template.base import Origin, Template, Context, TemplateDoesNotExist, add_to_builtins 
ImportError: cannot import name Origin 

柜面你需要buildout.cfg这里是..

[buildout] 
parts = django ipython omelette 
eggs = 
    reportlab 
    lxml 
    MySQL-python 
    markdown 
    sorl-thumbnail 
    django 
    django-tagging 
    django-pagination 
    django-staging 
    pyBarcode 
    dateutils 
    html5lib 
    oauth2 
    python-openid 
    pygeoip 
    django-rosetta 
    django-social-auth #check 
    South 
    unicodecsv 
    xlwt 
    django-mptt 
    django-registration 
    django-threaded-multihost 
    pycrypto 
    flup 
    ipython 

#PIL # custom install by pip 

extra-paths = 

[versions] 
django = 1.3.1 

[django] 
recipe = djangorecipe 
eggs = ${buildout:eggs} 
project = project 
projectegg = project 
settings = settings 
extra-paths = 
    ${buildout:extra-paths} 
    ${buildout:directory}/project 

[ipython] 
recipe = zc.recipe.egg 
eggs = 
    ipython 

[omelette] 
recipe = collective.recipe.omelette 
eggs = 
    django 

ignore-develop = true 

的sys.path - >

In [16]: sys.path 
Out[16]: 
['/srv/xxx/project/settings/../../lib', 
'', 
'/usr/local/bin', 
'/usr/local/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/Pygments-1.4-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/MarkupSafe-0.15-py2.7-freebsd-8.2-RELEASE-amd64.egg', 
'/usr/local/lib/python2.7/site-packages/Jinja2-2.6-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/Sphinx-1.1.2-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-freebsd-8.2-RELEASE-amd64.egg', 
'/usr/local/lib/python2.7/site-packages/flup-1.0.2-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/virtualenv-1.7-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg', 
'/usr/local/lib/python2.7/site-packages/lxml-2.3.3-py2.7-freebsd-8.2-RELEASE-amd64.egg', 
'/usr/local/lib/python2.7/site-packages/tornado-2.2-py2.7.egg', 
'/usr/local/lib/python27.zip', 
'/usr/local/lib/python2.7', 
'/usr/local/lib/python2.7/plat-freebsd8', 
'/usr/local/lib/python2.7/lib-tk', 
'/usr/local/lib/python2.7/lib-old', 
'/usr/local/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/site-packages', 
'/usr/local/lib/python2.7/site-packages/PIL', 
'/usr/local/lib/python2.7/site-packages/IPython/extensions', 
'/srv/xxx/project', 
'/srv/xxx', 
'/srv/xxx/parts/omelette', 
'/srv/xxx/eggs'] 

我想提一提,我试图安装从港口的Django(包管理器),我检查了sys.path,是的,它使用的是已安装的版本,仍然得到完全相同的错误。虽然django路径的一半作品..

而关于设置。我们有每个语言网站的5个设置文件。所以它是:settings.site_nl。如果我忘记添加内容,请在留言中留言。

回答

-3

不要做愚蠢的事情,谷歌的“django管理命令”

2

基本上,如果您在脚本中手动处理sys.path,那么您使用的编译错误。 Buildout可以为你处理所有安装的python蛋。如果Django运行正常,你的脚本也应该如此。

你缺少的是在bin目录中创建更多脚本的构建部分。为此,添加一个额外的部分扩建(并添加console_scriptsparts =列表):

[console_scripts] 
recipe = zc.recipe.egg 
interpreter = python 
eggs = 
    ${buildout:eggs} 

运行扩建之后,这让你在你的bin/目录一大堆额外的脚本。其他bin/python。看看它,你会发现它包含正确的sys.path东西,通过buildout为你预先配置好。

(运行后,您可能需要查看http://pypi.python.org/pypi/djangorecipe/1.1.2,这是一个扩展配置,可以让它更加舒适地安装Django)。