【问题标题】:Occasional ctypes error importing numpy from mod_wsgi django app从 mod_wsgi django 应用程序导入 numpy 时出现 ctypes 错误
【发布时间】:2010-09-21 16:51:49
【问题描述】:

设置如下:

  • 在 mod_wsgi 上导入 ctypes 的 Django (1.2) 应用程序
  • Python 2.6.5
  • Apache 2.2.3
  • SELinux 已禁用
  • 红帽 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,我认为这意味着这种情况永远不会发生:

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

【问题讨论】:

  • 考虑到回溯终止的位置,阻止分配内存的东西 PROT_WRITE 和 PROT_EXEC 似乎是最有可能的罪魁祸首。你确定你的系统上没有其他东西可以提供这种保护吗?
  • 我有几乎相同的设置,同样的问题,除了错误对我来说是一致的。重新启动 Apache 并不能解决我的问题。
  • 我们基本上通过不使用 numpy 解决了这个问题。自从删除了 numpy 导入后,我们再也没有看到它。我们并没有经常使用 numpy,所以我们只是编写了自己的替代品。

标签: python django apache numpy ctypes


【解决方案1】:

我也遇到过这个错误。在我的情况下,当我在 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 中的某个地方存在更深层次的问题,但修复对我有用。

【讨论】:

  • 自上次发布以来,bugzilla.redhat.com/show_bug.cgi?id=645193 上对该问题进行了大量讨论。至少在我的情况下,问题似乎在于默认的 SELinux 安全设置阻止 httpd 执行 /tmp 目录树中的代码,而 ctypes 显然试图这样做。上面的“修复”只是将问题推迟到确实需要使用 CFUNCTYPE。有关如何配置 SELinux 以允许 httpd 执行所需代码的说明,请参阅 bugzilla 链接 (bugzilla.redhat.com/show_bug.cgi?id=645193)。
  • 我应该提到:如果前面评论中的修复不能解决您的问题,请搜索“ctypes SELinux”。那里有很多讨论,例如bugzilla.redhat.com/show_bug.cgi?id=582009
  • 很抱歉重新散列旧线程。我在 numpy 1.21.2 上遇到了这个问题。不幸的是,我找不到ctypes/init.py。我正在使用 Anaconda,库安装到:/opt/conda/envs/venv/lib/python3.7/site-packages/numpy/。我手动搜索了文件夹并使用了grep:grep -ir CFUNCTYPE .,但我找不到要注释掉的文件和行。关于我可以在哪里搜索的任何可能的提示?谢谢你的帖子?
  • 哎呀...我搞砸了。该文件在这里:/opt/conda/envs/venv/lib/python3.7/ctypes/__init__.py 第 273 行,以防对其他人有所帮助
【解决方案2】:

如果其他人碰巧遇到这个问题,我的解决方法是从 Python 3.7 升级到 3.8。

这条违规行:https://github.com/python/cpython/blob/3.7/Lib/ctypes/__init__.py#L273

在 3.8 中被删除:https://github.com/python/cpython/blob/3.8/Lib/ctypes/__init__.py#L261-L270

希望它可以避免有人尝试修补 ctype/__init__.py 的麻烦,由于 conda pack 处理标准 Python 库的方式,这对我来说是不成功的。

希望对你有帮助?

【讨论】:

    【解决方案3】:

    考虑关闭 SELinux。 它应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2016-04-10
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多