偶然ctypes错误从mod_wsgi django应用程序导入numpy

And*_*w C 1 python apache django ctypes numpy

这是设置:

  • 关于导入ctypes的mod_wsgi的Django(1.2)应用程序
  • Python 2.6.5
  • Apache 2.2.3
  • SELinux被禁用
  • RedHat EL 5 64bit
  • 一些文件系统挂载在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
Run Code Online (Sandbox Code Playgroud)

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

有关如何一致地重现和/或修复它的任何建议?这真是难倒我!

tra*_*eek 8

我也遇到过这个bug.在我的情况下,当我在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)
Run Code Online (Sandbox Code Playgroud)

显然cpython中有一个更深层次的问题,但修复对我有用.

  • 自上次发布以来,https://bugzilla.redhat.com/show_bug.cgi?id=645193对此问题进行了大量讨论.至少在我的情况下,似乎问题是默认的SELinux安全设置阻止httpd在/ tmp目录树中执行代码,ctypes显然试图这样做.上面的"修复"只是推迟了问题,直到确实需要使用CFUNCTYPE.有关如何配置SELinux以允许httpd执行所需代码的说明,请参阅bugzilla链接(https://bugzilla.redhat.com/show_bug.cgi?id=645193). (3认同)