Numpy: 运行时错误:implementation_array_function 方法已经有一个文档字符串

创建于 2019-08-28  ·  20评论  ·  资料来源: numpy/numpy

重现代码示例:

from flask import Flask

import numpy

app = Flask(__name__)

作为 uwsgi 应用程序。

完整环境: https :

错误信息:

|> test_bot_1                 | [uWSGI] getting INI configuration from /config/uwsgi.ini
|> test_bot_1                 | *** Starting uWSGI 2.0.18 (64bit) on [Wed Aug 28 00:25:33 2019] ***
|> test_bot_1                 | compiled with version: 6.3.0 20170516 on 04 May 2019 16:28:22
|> test_bot_1                 | os: Linux-4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017
|> test_bot_1                 | nodename: 2dd932a7998b
|> test_bot_1                 | machine: x86_64
|> test_bot_1                 | clock source: unix
|> test_bot_1                 | pcre jit disabled
|> test_bot_1                 | detected number of CPU cores: 8
|> test_bot_1                 | current working directory: /app
|> test_bot_1                 | detected binary path: /usr/local/bin/uwsgi
|> test_bot_1                 | your processes number limit is 1048576
|> test_bot_1                 | your memory page size is 4096 bytes
|> test_bot_1                 | detected max file descriptor number: 1048576
|> test_bot_1                 | lock engine: pthread robust mutexes
|> test_bot_1                 | thunder lock: disabled (you can enable it with --thunder-lock)
|> test_bot_1                 | uwsgi socket 0 bound to UNIX address /sockets/bots/test_bot.sock fd 3
|> test_bot_1                 | Python version: 3.6.8 (default, Mar 27 2019, 08:49:59)  [GCC 6.3.0 20170516]
|> test_bot_1                 | *** Python threads support is disabled. You can enable it with --enable-threads ***
|> test_bot_1                 | Python main interpreter initialized at 0x55b90bbdc100
|> test_bot_1                 | your server socket listen backlog is limited to 100 connections
|> test_bot_1                 | your mercy for graceful operations on workers is 60 seconds
|> test_bot_1                 | mapped 1239640 bytes (1210 KB) for 16 cores
|> test_bot_1                 | *** Operational MODE: preforking ***
|> test_bot_1                 | WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55b90bbdc100 pid: 1 (default app)
|> test_bot_1                 | mounting main.py on /test_bot
|> test_bot_1                 | Traceback (most recent call last):
|> test_bot_1                 |   File "main.py", line 3, in <module>
|> test_bot_1                 |     import numpy
|> test_bot_1                 |   File "/usr/local/lib/python3.6/site-packages/numpy/__init__.py", line 142, in <module>
|> test_bot_1                 |     from . import core
|> test_bot_1                 |   File "/usr/local/lib/python3.6/site-packages/numpy/core/__init__.py", line 17, in <module>
|> test_bot_1                 |     from . import multiarray
|> test_bot_1                 |   File "/usr/local/lib/python3.6/site-packages/numpy/core/multiarray.py", line 14, in <module>
|> test_bot_1                 |     from . import overrides
|> test_bot_1                 |   File "/usr/local/lib/python3.6/site-packages/numpy/core/overrides.py", line 47, in <module>
|> test_bot_1                 |     """)
|> test_bot_1                 | RuntimeError: implement_array_function method already has a docstring

Numpy/Python 版本信息:

新安装的numpy ,2019-08-28。

57 - Close?

最有用的评论

将 numpy 降级到 numpy==1.15.4 对我有用。

所有20条评论

经过相当多的测试,我很确定这与在uwsgi内运行有关。

这敲响了一个模糊的钟声。 IIRC uwsgi执行某种文档字符串操作,例如使用-OO

这也发生在 Spyder 中,它使用 IPython 作为其 Python 控制台。 他们有一种称为“用户模块重新加载器”的技术,它“强制 Python 重新加载在 Python 或 IPython 控制台中执行文件时导入的模块”。 基本上这是del sys.modules[modname]

当尝试运行一个导入 numpy 的脚本时,我得到一个以

[...]
将 numpy 导入为 np

文件“C:\Program Files\Python35\lib\site-packagesnumpy\__init__.py”,第 142 行,在
从 。 进口核心

文件“C:\Program Files\Python35\lib\site-packagesnumpy\core\__init__.py”,第 17 行,在
从 。 导入多阵列

文件“C:\Program Files\Python35\lib\site-packagesnumpy\core\multiarray.py”,第 14 行,在
从 。 导入覆盖

文件“C:\Program Files\Python35\lib\site-packagesnumpy\core\overrides.py”,第 47 行,在
""")

运行时错误:implementation_array_function 方法已经有一个文档字符串

也发生在我身上(Django 服务器):

  File "/opt/project/consensx/graph/values_graph.py", line 2, in <module>
    import matplotlib.pyplot as plt
  File "/pyroot/lib/python3.7/site-packages/matplotlib/__init__.py", line 138, in <module>
    from . import cbook, rcsetup
  File "/pyroot/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 31, in <module>
    import numpy as np
  File "/pyroot/lib/python3.7/site-packages/numpy/__init__.py", line 142, in <module>
    from . import core
  File "/pyroot/lib/python3.7/site-packages/numpy/core/__init__.py", line 17, in <module>
    from . import multiarray
  File "/pyroot/lib/python3.7/site-packages/numpy/core/multiarray.py", line 14, in <module>
    from . import overrides
  File "/pyroot/lib/python3.7/site-packages/numpy/core/overrides.py", line 47, in <module>
    """)
RuntimeError: implement_array_function method already has a docstring

蟒蛇 7.3.7
麻木:1.17.2

这里真正的问题是 NumPy 不支持在此过程中重新初始化。 这可以追溯到 2012 年的 gh-665。解决这个问题需要仔细捕获我们在结构中创建的所有全局状态,并通过模块上的 getter 访问它。

哦,全球人。 这些总是很有趣。

将 numpy 降级到 numpy==1.15.4 对我有用。

将 numpy 降级到 numpy==1.15.4 对我有用。

此版本的 numpy (1.15.4) 适用于女巫版本的熊猫?
因为有了熊猫 1.0.3 =
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject

另一个问题,你认为这个错误会很快修复吗?

多谢。

另一个问题,你认为这个错误会很快修复吗?

如果“这个错误”是指允许删除和重新导入 numpy,那么答案是“它不在我们的路线图上”。 这是开源的,因此任何人都可以为修复它做出贡献,但这将是一项相当大的任务。

如果您只有一个导入警告,那么您可以忽略它。 但我猜你正在使用 uwsgi ...

如果这是由于 uwsgi 造成的,那么我的答案是我们不会支持它,您将不得不为此付出非常大的努力。 目前,甚至不是所有Python 都支持这一点,他们正在研究它,并模糊地希望有一天它会起作用。 但要求我们完成这项工作根本不会有任何结果。 当然,您可以尝试投入时间和金钱来改善情况,这是受欢迎的,但不要抱有希望。

Python 最终之后(这可能需要一段时间,他们已经为此工作了很多年)并且有相当大的用户群,可能会有一些人对它感兴趣。
目前,我们有公共 API,据我所知,它与 wsgi 所做的(使用子解释器)根本不兼容,并且我们可能有一些我们可能想要的优化缓存,据我所知 Python还没有提供任何机制来制作他们在这个设置中很快

事实是,wsgi 默认使用的子解释器根本不受合理大小的 C 扩展系统的支持。 在可预见的未来,这不会发生。 如果有人认为或期望这是 NumPy 路线图的重要内容,那么在我看来,Python 开发人员的信号是错误的(我已经说过了,而且似乎在那里得到了承认)。 因为他们应该告诉每个人,必须假设子解释器在绝大多数 C 扩展中都失败了,没有人应该期望情况会在中期(未来几年)发生变化,并且基本上该功能是实验性的它涉及到 C 扩展支持。

是的,许多 Python 核心开发人员很高兴地朝着让事情工作的方向前进,但从 NumPy 等项目的角度来看,支持子解释器(wsgi 默认值)并不比 Python 2 到 Python 3 的转换更容易,只需一小部分潜在用户,目前甚至没有技术来正确支持一切!

所以,在这个咆哮之后......我会结束这个,如果有人想花精力让 NumPy 工作(更好地使用子解释器),这是一项崇高的努力。 我很高兴被证明是错误的......但我同意子解释器(wsgi)必须被视为实验性和功能的观点。 即,如果您使用子解释器,则更像是使用一些边缘 Python 实现(如早期的 PyPy)。 几年后,任何使用 PyPy 的人都希望在 PyPy 中运行 NumPy(而 PyPy 为实现这一目标做了所有工作)......

嗯,我完全同意我们不关心子解释器(无论如何),但这是一个更简单的问题 - 它在 1.15.4 和 Django、Spyder 等报告中不涉及uwsgi 。 我将快速更改__array_function__的文档字符串附件。

真的错过了那些。 虽然我也想知道......在这种情况下它应该是相当安全的。 从某种意义上说,它希望只会泄漏内存。 (我仍然有点想知道 Spyder 是否不应该只是跳过 C 扩展模块,至少在 CPython 获得更多机制来说明 C 扩展模块安全地实现它之前......即便如此,对于大多数 C 扩展模块重新加载可能几乎什么都不做)。

即便如此,对于大多数 C 扩展模块,重新加载可能几乎没有任何作用)。

我不认为这是重点。 说reload(any_module)比在尝试之前弄清楚是否有一些编译的扩展作为 Python 包的一部分挂起来要容易得多。

不确定 Django 究竟做了什么,但它可能是相似的。

我不想太烦你。

我有一个使用 Flask 和 Numpy 的网络服务,我想我不是唯一一个。
我对 Flask 中包含的开发服务器(当然是 Werkzeug)没有任何错误。

事实上,在生产中,我使用 Python3 的 apache2 WSGI 模块,它允许我保持负载(几个线程)

我是开放的,告诉我用什么:

非常感谢。

子解释器段落中的任何内容都应该是关于 NumPy 的合理建议。 我不能就什么可能适用于网络服务提供任何建议,但也许这个线程中的其他人可以。

我只是想明确一点,让情况稍微好一点可能是好的(并帮助一些人),但在可预见的未来不会解决深层问题。 在任何情况下,我想我们可能会尝试消除此故障,而是给出一个巨大的警告,即这可能会导致难以调试的问题。

也许它会帮助某人,因为它之前没有提到:
我正在使用uwsgi (使用 Nginx)并且“ single-interpreter = true ”ini 配置(或--single-interpreter开关)为我解决了这个问题

在这里我找到了这个标志的解释:

默认情况下,uWSGI 将在进程的子解释器中执行 Python 代码,而不是在 Python 首次初始化时创建的主 Python 解释器。 这样做是为了允许多个单独的 Python Web 应用程序在一个进程中运行,但要充分分离,以免相互干扰。 然而,当使用启用线程的子解释器时,旧版本的 uWSGI 可能会失败。 因此,最安全的做法是使用此选项并将自己限制在每个进程的单个 Web 应用程序中。 使用 uWSGI 在每个进程中运行单个 Web 应用程序是正常用例,因此此限制不太可能成为问题。

因此,作为一种解决方法,您可以使用此配置切换到 uwsgi,或者尝试为您的环境找到类似的东西。

将重新打开,直到我们实际合并修复/解决方法 - 应该很快。

昨天我也遇到了同样的错误,我就是不知道发生了什么。 为了完成起见,我将在这里说明原因:我有一个名为 logger.py 的记录器模块,它正在覆盖 Numpy 中的某些内容。 更改了模块名称,没有错误。 也许其他人会看到这个评论并找出类似的事情发生在他们身上。

我们已经为 1.19 推送了一个修复程序。 或者更确切地说是一种解决方法,因为错误仍然表明正在发生的事情可能会产生问题。

@seberg使用 1.19 中的解决方法我们应该关闭它吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Levstyle picture Levstyle  ·  3评论

keithbriggs picture keithbriggs  ·  3评论

Kreol64 picture Kreol64  ·  3评论

perezpaya picture perezpaya  ·  4评论

inducer picture inducer  ·  3评论