Skip to main content
 首页 » 编程设计

python之从 mod_wsgi django 应用程序导入 numpy 时偶尔出现 ctypes 错误

2025年05月04日30qq号

这是设置:

  • mod_wsgi 上导入 ctypes 的 Django (1.2) 应用
  • python 2.6.5
  • Apache 2.2.3
  • 禁用 SELinux
  • RedHat EL 5 64 位
  • 一些文件系统挂载在 nfs 上

有时,当我重新启动 apache 时,我在尝试导入 ctypes 时遇到导入错误。每个传入请求都会失败并出现 500 错误。如果我重新启动 apache,通常一切都会重新开始工作。

这是错误的堆栈跟踪:

Traceback (most recent call last): 
 
 File "/home/appfirst/django/django/core/handlers/base.py", line 80, in get_response 
   response = middleware_method(request) 
 
     -------------- A BUNCH OF DJANGO MIDDLEWARE STUFF HERE ------------- 
 
 File "/home/appfirst/django/django/utils/importlib.py", line 35, in import_module 
   __import__(name) 
 
 File "/home/appfirst/backend/backend/streamer/views.py", line 6, in <module> 
   import appfirst.main.models as FEmodels 
 
 File "/home/appfirst/frontend/appfirst/main/models.py", line 27, in <module> 
   import numpy, math, mpmath 
 
 File "/usr/lib64/python2.6/site-packages/numpy/__init__.py", line 43, in <module> 
   import ctypeslib 
 
 File "/usr/lib64/python2.6/site-packages/numpy/ctypeslib.py", line 9, in <module> 
   import ctypes 
 
 File "/usr/lib64/python2.6/ctypes/__init__.py", line 546, in <module> 
   CFUNCTYPE(c_int)(lambda: None) 
 
MemoryError 

我认为它可能与这个错误有关,但我关闭了 SELinux,我认为这意味着这种情况永远不会发生:

关于如何一致地重现它和/或修复它有什么建议吗?这真是难倒我了!

请您参考如下方法:

我也遇到过这个问题。在我的例子中,当我在 64 位 Linux 系统上的 Apache 下运行的 PHP 脚本中执行 Python 脚本时,就会发生这种情况。 [正在运行的 Python 代码是 pypy 沙箱的前端。]同样的代码在 32 位系统上运行良好,甚至在直接从命令行执行 PHP 脚本时也能正常运行。我的“修复”只是在 ctypes/init.py 中注释掉“CFUNCTYPE(c_int)(lambda: None)”这一行。它是文件的最后一行,前面有以下注释,表明程序员也不明白发生了什么!

# XXX for whatever reasons, creating the first instance of a callback 
# function is needed for the unittests on Win64 to succeed.  This MAY 
# be a compiler bug, since the problem occurs only when _ctypes is 
# compiled with the MS SDK compiler.  Or an uninitialized variable? 
CFUNCTYPE(c_int)(lambda: None) 

显然 cpython 中存在更深层次的问题,但修复对我有效。