Skip to main content
 首页 » 编程设计

python之无法使用 nosegae 导入 django 包

2025年05月04日24sky-heaven

我正在尝试开始使用 nosegae,但是我遇到了一个问题,即在使用 django 时,即使是最简单的情况,我似乎也无法让它通过。

在没有 --without-sandbox 标志的情况下运行时,以下两个测试均失败

def test_import_django  (): 
    import django 
 
def test_import_django_http  (): 
    import django.http 

Traceback (most recent call last): 
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\case.py", line 1 
97, in runTest 
    self.test(*self.arg) 
  File "C:\Users\User\Desktop\TDD_GAE\myproj\tests.py", line 2, in test_import_d 
jango 
    import django 
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line 
207, in find_module 
    return super(HookMixin, self).find_module(fullname, path) 
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de 
v_appserver.py", line 1505, in Decorate 
    return func(self, *args, **kwargs) 
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de 
v_appserver.py", line 1998, in find_module 
    search_path) 
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de 
v_appserver.py", line 1505, in Decorate 
    return func(self, *args, **kwargs) 
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de 
v_appserver.py", line 2119, in FindModuleRestricted 
    result = self.FindPathHook(submodule, submodule_fullname, path_entry) 
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de 
v_appserver.py", line 2219, in FindPathHook 
    return self._imp.find_module(submodule, [path_entry]) 

但是,如果我确实使用 --without-sandbox 至少第一个测试通过了

myproj.tests.test_import_django ... ok 
myproj.tests.test_import_django_http ... ERROR 
 
====================================================================== 
ERROR: myproj.tests.test_import_django_http 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\case.py", line 1 
97, in runTest 
    self.test(*self.arg) 
  File "C:\Users\User\Desktop\TDD_GAE\myproj\tests.py", line 5, in test_import_d 
jango_http 
    import django.http 
  File "C:\Program Files (x86)\Google\google_appengine\lib\django_1_2\django\htt 
p\__init__.py", line 9, in <module> 
    from mod_python.util import parse_qsl 
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line 
199, in find_module 
    mod_path = self.find_mod_path(fullname) 
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line 
251, in find_mod_path 
    _sf, path, _desc= self._imp.find_module(top, None) 
AttributeError: 'str' object has no attribute 'find_module' 

有没有人遇到并知道我该如何解决这个问题?

编辑

看来是递归导入的问题

def test_import_pdb (): 
    import pdb 
    pdb.set_trace () 

部分堆栈跟踪是

File "C:\Python27\lib\pdb.py", line 72, in __init__ 
  import readline 

请注意 django.http 的 __init__ 中的 import 也是堆栈跟踪的一部分

请您参考如下方法:

阅读https://docs.djangoproject.com/en/dev/topics/testing/关于 Django 测试。

据我所知,最好使用 django 附带的 unittest 或 doctest,因为它对特定于 django 的测试有多项改进,例如表单字段输出测试和一些数据库功能。然而这不是必需的,如果你想继续使用 nose - 认为你错过了 django 环境设置:

from django.test.utils import setup_test_environment 
setup_test_environment() 

此行需要在 ./manage.py --test 之外运行测试

UPD 是的,我之前的想法是错误的。所以我只是深入研究了 nose 和 nose-gae 的来源,以及我的想法 - 检查你的 nose 版本中的 HardenedModulesHook 定义,因为在鼻腔中我发现了以下内容:

class HardenedModulesHook(object): 
    ... 
    def __init__(self, 
               module_dict, 
               imp_module=imp, 
               os_module=os, 
               dummy_thread_module=dummy_thread, 
               pickle_module=pickle): 
    ... 

这给出了以下 - 当 noseGAE 插件 begin() 方法被执行时 -> 那里 self._install_hook(dev_appserver.HardenedModulesHook) 被调用,它声明了混合钩子(Hook)类和创建它的实例,如 self.hook = Hook(sys.modules, self._path)。 <- 有 HardenedModulesHook.__init__ 以第二个参数作为神秘的 '_path' 调用,但是在 NOSE 中,这个参数默认应该是 'imp' 模块 -> 这使你有一个异常(exception):

    _sf, path, _desc= self._imp.find_module(top, None) 
AttributeError: 'str' object has no attribute 'find_module'   

所以我认为这可能是 nose-gae 的问题:(