Джанго автономный скрипт в buildout env - PullRequest
0 голосов
/ 22 марта 2012

Что ж, это довольно жесткая проблема, «предложение другого решения» в данной ситуации недоступно, поэтому, пожалуйста, попробуйте помочь мне решить эту проблему, а не избежать ее =)

Итак, есть проект 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 / что угодно - не работает .. последняя строка этого скрипта дает эту ошибку

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, да, он использовал установленную версию, все равно получаю точно такую ​​же ошибку. хотя половина работ пути Джанго ..

А насчет настроек. у нас есть 5 файлов настроек для каждого языкового сайта. так что это: settings.site_nl. Если я забыл что-то добавить, пожалуйста, оставьте сообщение в комментарии.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

По сути, если вы обрабатываете sys.path вручную в своем скрипте, вы неправильно используете buildout. Buildout обрабатывает все ваши установленные яйца Python для вас. Если django работает нормально, ваш скрипт тоже должен.

Что вам не хватает, так это часть компоновки, которая создает больше скриптов в вашем каталоге bin. Для этого добавьте дополнительную часть в 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 еще более удобной).

0 голосов
/ 23 марта 2012

Не делайте глупостей, Google для "команд управления Django"

...