buildout环境中的Django独立脚本

时间:2012-03-22 12:29:06

标签: python django buildout

嗯这是一个相当苛刻的问题,“不同的解决方案提案”目前的情况不可用,所以请尽量帮我解决这个问题,不要避免它=)

所以有一个django项目使用buildout但不使用virtualenv(因为我们在安装字体时遇到问题......)。项目工作正常。现在我正在尝试实现django独立脚本,我认为我有一个路径问题。首先,我想介绍一个基础目录的结构。

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 / project / app / 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 - 不起作用..这个脚本的最后一行给出了这个错误< / p>

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 - &gt;

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']

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

关于设置。我们为每个语言网站提供了5个设置文件。所以它是:settings.site_nl。如果我忘了添加内容,请在评论中留言。

2 个答案:

答案 0 :(得分:2)

基本上,如果你在脚本中手动处理sys.path,那么你使用buildout是错误的。 Buildout会为您处理所有已安装的蟒蛇蛋。如果django运行正常,你的脚本也应该。

您缺少的是一个可在bin目录中创建更多脚本的buildout部件。为此,在buildout中添加一个额外的部分(并将console_scripts添加到您的parts =列表中):

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

运行buildout后,这会在bin/目录中为您提供大量额外脚本。其中bin/python。查看它,你会看到它包含正确的sys.path内容,由buildout预先配置。

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

答案 1 :(得分:-3)

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