嗯这是一个相当苛刻的问题,“不同的解决方案提案”目前的情况不可用,所以请尽量帮我解决这个问题,不要避免它=)
所以有一个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。如果我忘了添加内容,请在评论中留言。
答案 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管理命令”