虚拟环境和Google App Engine Django一起使用时,出现了unittest导入错误

4

我正在使用google-app-engine-django和压缩的django进行工作。只需运行“python manage.py test”即可成功通过测试,没有错误。

但是在virtualenv中,测试失败并显示“导入unittest错误”。与Django 1.1相同的错误。

- OSX 10.5.6
- google-app-engine-django (r101 via svn) : r100 was failed with launcher 1.3.0
- GoogleAppLauncher 1.3.0
- Django 1.1 & 1.1.1 (zipped) : both failed
- virtualenv 1.4.5 
- virtualenvwrapper 1.24

错误信息:
(django_appengine)Reiot:warclouds Reiot$ python manage.py test
WARNING:root:Could not read datastore data from /var/folders/UZ/UZ1vQeLFH2ShHk4kIiLcFk+++TI/-Tmp-/django_google-app-engine-django.datastore
INFO:root:zipimporter('/Volumes/data/Documents/warclouds/django.zip', 'django/core/serializers/')
.WARNING:root:Can't open zipfile /Users/Reiot/.virtualenvs/django_appengine/lib/python2.5/site-packages/setuptools-0.6c11-py2.5.egg: IOError: [Errno 13] file not accessible: '/Users/Reiot/.virtualenvs/django_appengine/lib/python2.5/site-packages/setuptools-0.6c11-py2.5.egg'
WARNING:root:Can't open zipfile /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg: IOError: [Errno 13] file not accessible: '/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg'
ERROR:root:Exception encountered handling request
Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3177, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3120, in _Dispatch
    base_env_dict=env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 515, in Dispatch
    base_env_dict=base_env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2379, in Dispatch
    self._module_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2289, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2185, in ExecuteOrImportScript
    exec module_code in script_module.__dict__
  File "/Volumes/data/Documents/warclouds/main.py", line 28, in <module>
    from appengine_django import InstallAppengineHelperForDjango
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1264, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1914, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1264, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1816, in FindAndLoadModule
    description)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1264, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1767, in LoadModuleRestricted
    description)
  File "/Volumes/data/Documents/warclouds/appengine_django/__init__.py", line 44, in <module>
    import unittest
ImportError: No module named unittest
INFO:root:"GET / HTTP/1.1" 500 -
INFO:root:zipimporter('/Users/Reiot/.virtualenvs/django_appengine/lib/python2.5/site-packages/setuptools-0.6c11-py2.5.egg', '')
INFO:root:zipimporter('/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg', '')
F...........................................................
======================================================================
FAIL: a request to the default page works in the dev_appserver
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Volumes/data/Documents/warclouds/appengine_django/tests/integration_test.py", line 176, in testBasic
    self.assertEquals(rv.status_code, 200)
AssertionError: 500 != 200

我也尝试了使用控制台导入,但是没问题。

> which python
/Users/Reiot/.virtualenvs/django_appengine/bin/python
> python
>>> import unittest

这是我的环境:
$ mkvirtualenv --no-site-packages no-django
$ mkvirtualenv --no-site-packages django-1.1
$ mkvirtualenv --no-site-packages django-1.1.1
(django-1.1)$ easy_install Django-1.1.tar
(django-1.1.1)$ easy_install Django-1.1.1.tar
$ mkdir google-app-engine-django-svn
$ cp -r google-app-engine-django-svn google-app-engine-django-svn-django-1.1
// copy appropriate django.zip
$ cp -r google-app-engine-django-svn google-app-engine-django-svn-django-1.1.1
// copy appropriate django.zip

我也看到了这个问题。起初我以为是我的Python安装有问题,但实际上10.6版本也存在这个问题。Virtualenv没有识别所有路径... - rh0dium
1个回答

3
这是一个非常复杂的实现。我正在研究如何创建virtualenv - GAE - django组合,但我可能会稍后回来提供更多信息,目前我有以下内容:
不同之处在于我使用的是Django-nonrel,但我也尝试过google-app-engine-django,就virtualenv而言,它们似乎工作方式相同。
virtualenv的python解释器无法直接启动manage.py:django的manage.py和dev_appserver.py需要对sys.path进行广泛的控制,显然以一种使其与virtualenv共存的方式。
然而,某种程度的共存似乎是可能的:
我已经创建了这样的目录结构:
./src < -- django-nonrel源代码和我的源代码 djangoappengine/ < -- 来自wkornewald的bitbucket源代码 django/ < -- 也是wkornewald的bitbucket... / < -- 我们的应用程序

./www <-- 我的 Django 根目录 manage.py、app.yaml、settings.py、templates/ 等等.. common-apps/ <-- django-nonrel 要求将包放在这里 .google_appengine <-- 链接到我的 GAE 安装

我使用 'python2.5 manage.py runserver' 命令在上面叫做 'www/' 的目录中启动开发服务器。

(基本上是 rh0dium 在 http://rh0dium.blogspot.com/2010/02/development-strategy-for-google-app.html 中建议的目录结构)

我在上面的顶级目录中创建了虚拟环境。

$ virtualenv --python=python2.5 --no-site-packages --distribute .

然后我将两个文件放在lib/python2.5/site-packages目录下:

gae.pth,

<full path to GAE>
<full path to GAE>/lib/antlr3
<full path to GAE>/lib/webob
<full path to GAE>/lib/yaml/lib

django-nonrel.pth

<project path>/src/django-nonrel
<project path>/src

这些文件可以(应该?)被分开,但为了简单起见,我暂时保持它们不变。

如果与正确设置的setup.py结合使用,至少可以让我拥有一个交互式提示符,可以导入Django设置可以导入的所有内容,以供玩耍和测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接