1

我正在尝试调试 python 导入语句随机失败的错误,而其他时候它们运行干净。

这是我看到的例外的一个例子。有时我会看到这个,有时我会在不同的模块中看到另一个,尽管它似乎总是出现在 4 个模块之一中。

ERROR:root:/home/user/projecteat/django/contrib/auth/management/__init__.py:25:     RuntimeWarning: Parent module 'django.contrib.auth.management' not found while handling absolute import
from django.contrib.contenttypes.models import ContentType

由于随机性,我几乎可以肯定这是一个线程问题,但我不明白为什么会出现导入错误,所以我不确定在调试中要寻找什么。如果不同的线程试图加载相同的模块,这可能是由文件系统争用引起的吗?

我正在尝试让 Django 1.4 的 LiveServerTestCase 在 Google App Engine 的开发服务器上运行。主线程运行 django 的测试框架。当它加载一个基于 LiveServerTestCase 的测试类时,它会生成一个子线程来启动 App Engine dev_appserver,它是一个本地网络服务器。主线程继续运行测试,使用 Selenium 驱动程序发出 HTTP 请求,这些请求由子线程上的 dev_appserver 处理。

在拆除测试用例类之前,测试框架可能会在基于 LiveServerTestCase 的类中运行一些测试。在拆卸时,子线程结束。

看起来异常发生在子(HTTP 服务器)线程中,主要是在单个测试用例类中的测试之间。

App Engine LiveServerTestCase 类的代码在这里:https ://github.com/dragonx/djangoappengine/blob/django-1.4/test.py

提供此问题所需的所有调试信息非常困难。我主要是在寻找关于为什么 python 导入语句会给出 RuntimeWarning 错误的建议。

4

1 回答 1

0

我对自己的问题有部分答案。发生的事情是我有两个线程正在运行。

线程 1 正在处理 HTTP 请求的 dev_appserver (dev_appserver_main) 内部运行主要内部函数。

线程 2 正在运行基于 Selenium 的测试用例。该线程将向浏览器发送命令以执行某些操作(然后间接生成 HTTP 请求并重新进入线程 1)。然后,它要么向 Selenium 发出更多请求以检查状态,要么进行数据存储查询以检查结果。

认为问题在于,在处理每个 HTTP 请求时,线程 1 (dev_appserver) 会更改环境,从而无法访问某些文件夹(app.yaml 中排除的文件夹以及不属于 appengine 的环境)。如果此时线程 2 恰好运行了一些代码,如果某些导入位于这些文件夹中,则它们可能无法加载。

于 2012-07-27T13:15:41.220 回答