在部署后如何在Django中使用scipy.stats.stats

5 投票
2 回答
1070 浏览
提问于 2025-04-17 04:36

我正在创建一个基于Django(1.3)的界面,这个界面依赖于一个叫做ovl的包,它主要使用了scipy.stats.stats(scipy版本0.9.0)。在早期开发阶段,使用Django自带的开发服务器时,这没什么问题。但是在用apache debian/2.2.9和mod_wsgi 3.3部署后,就出现了严重的问题。

无论我在浏览器中尝试加载哪个视图,它都会开始加载,并且持续加载大约5分钟(直到超时),然后出现500错误页面。单独导入scipy是可以的,但并不能使用scipy.stats.stats或者scipy.stats。这并不奇怪;在scipy的init.py文档中提到,子包stats需要明确导入。然而,关于子包cluster也是这样说的,但在Django中(无论是从网页还是在Django命令行中)都没有问题,并且在dir(scipy)中可以看到它,而在ipython(0.10.2)会话中却看不到,正如我预期的那样。

在命令dir(scipy)中,结果在网页和普通ipython命令行中是不同的(网页返回568个字符串,包括子包cluster,而普通ipython命令行返回564个字符串,没有cluster)。而在Django命令行中,scipy有570个属性,包括clusterstats包。

还有一点是,如果我在导入ovl包的同时,把scipy.stats的导入放在一边(不在应用的文件中),有时会出现ViewDoesNotExist错误,提示在视图模块中没有index方法,而实际上是有的。这让我想起了这个

所以现在我在考虑一些比较糟糕的解决方案:

  • 编辑scipy的init文件,导入stats包,这样它就能在dir(scipy)中正常出现,并且可以通过scipy.stats访问,这样我就可以使用旧代码。
  • 把scipy的stats子包拿出来,做成一个常规包(也许使用符号链接)。

不过,我对这些解决方案有些犹豫。cluster在Django环境中能显示出来让我有点担心。我想这可能和从网页登录时使用www-data用户有关,但我不知道怎么检查这个。

有没有其他人遇到过这个问题?或者有其他有用的想法吗?

哦,还有另一个Django部署是可以工作的。

2 个回答

1

我在用django开发应用的时候,也遇到了这个问题。当我在django的管理工具里运行我的应用时,一切都正常,没有任何问题。但是,当我把应用部署到使用mod_python的apache服务器上时,我就无法进入我的应用,浏览器一直在加载,直到超时。后来我把应用中所有引入的scipy.stats相关的代码都删掉了,这个问题就解决了,我可以在apache服务器上正常运行我的应用了。

5

mod_python 曾经尝试在同一个进程中使用多个 Python 解释器。mod_wsgi 可能也在做类似的事情。虽然这样通常可以正常工作,但有些扩展模块不支持这种方式。scipy.stats 可能正在导入这样的扩展模块。我们在 scipy 的邮件列表上也收到过关于在 mod_python 下使用 scipy.stats 的类似报告。你可以查看 mod_wsgi 的文档,看看是否可以配置它,使其在同一个进程中不使用多个解释器,或者找到一种不同的部署方式,让每个进程只使用一个解释器来运行应用。

撰写回答