Случайные ошибки ctypes при импорте numpy из приложения mod_wsgi django - PullRequest
1 голос
/ 21 сентября 2010

Вот настройки:

  • Приложение Django (1.2) на mod_wsgi, которое импортирует ctypes
  • 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

Я думал, что это может быть связано с этой ошибкой, но у меня отключен SELinuxчто, как я думал, могло бы означать, что этот случай никогда не произойдет:

Есть предложения о том, как последовательно воспроизвести и / или исправить это?Это действительно ставит меня в тупик!

Ответы [ 2 ]

8 голосов
/ 21 июля 2011

Я тоже столкнулся с этой ошибкой.В моем случае это происходит, когда я выполняю скрипт Python из скрипта PHP, работающего под Apache в 64-битной системе Linux.[Выполняемый код Python является внешним интерфейсом для песочницы pypy.] Тот же самый фрагмент кода отлично работает в 32-разрядной системе и даже отлично работает, когда сценарий PHP выполняется непосредственно из командной строки.Мое "исправление" заключалось в том, чтобы просто закомментировать эту строку "CFUNCTYPE (c_int) (lambda: None)" в ctypes / init .py.Это последняя строка файла и ему предшествует следующий комментарий, показывающий, что программист тоже не понимает, что происходит!

# 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 есть более глубокая проблема, но исправлениеу меня работает.

0 голосов
/ 21 февраля 2011

Рассмотрите возможность выключения SELinux. Это должно решить проблему.

...