Numpy: RuntimeError: يحتوي الأسلوب Implement_array_function بالفعل على سلسلة docstring

تم إنشاؤها على ٢٨ أغسطس ٢٠١٩  ·  20تعليقات  ·  مصدر: numpy/numpy

مثال على إعادة إنتاج الكود:

from flask import Flask

import numpy

app = Flask(__name__)

كتطبيق uwsgi.

بيئة كاملة: https://github.com/luckydonald-archive/numpy-issues-14384/

رسالة خطأ:

|> 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 يقوم بنوع من معالجة docstring ، مثل الجري مع -OO .

يحدث هذا أيضًا في Spyder ، والذي يستخدم IPython لوحدة تحكم Python الخاصة به. لديهم تقنية تسمى "أداة إعادة تحميل وحدة المستخدم" ، والتي "تجبر Python على إعادة تحميل الوحدات التي تم استيرادها عند تنفيذ ملف في وحدة تحكم Python أو IPython". في الأساس هذا لا del sys.modules[modname] .

عند محاولة تشغيل برنامج نصي يستورد numpy ، أحصل على تتبع مكدس ينتهي بـ

[...]
استيراد numpy كـ np

الملف "C: \ Program Files \ Python35 \ lib \ site -packsnumpy \ __ init__.py" ، السطر 142 ، في
من عند . جوهر الاستيراد

ملف "C: \ Program Files \ Python35 \ lib \ site -packnumpy \ core \ __ init__.py" ، السطر 17 ، في
من عند . استيراد متعدد

ملف "C: \ Program Files \ Python35 \ lib \ site -packnumpy \ core \ multiarray.py" ، السطر 14 ، في
من عند . تجاوزات الاستيراد

ملف "C: \ Program Files \ Python35 \ lib \ site -packnumpy \ core \ overrides.py" ، السطر 47 ، في
"")

RuntimeError: يحتوي الأسلوب Implement_array_function بالفعل على سلسلة docstring

يحدث لي أيضًا (خادم 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
numpy: 1.17.2

المشكلة الحقيقية هنا هي أن NumPy لا يدعم إعادة التهيئة في العملية. يعود هذا إلى gh-665 من عام 2012. سيتطلب حل هذا الالتقاط بعناية لجميع الحالة العالمية التي أنشأناها في بنية ، والوصول إليها عبر أداة تجميع في الوحدة.

أوه ، الكرة الأرضية. هذه دائما ممتعة.

لقد أدى الرجوع من مرتبة 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 الأشياء معًا من نهايتها (قد يستغرق هذا بعض الوقت ، وهم يعملون على هذا لسنوات عديدة) وهناك قاعدة مستخدم كبيرة بشكل معقول قد يكون هناك بعض الاهتمام بها.
في هذا الوقت ، لدينا واجهة برمجة تطبيقات عامة لا تتوافق بشكل أساسي مع ما يفعله wsgi (استخدام المترجمين الفرعيين) ، ومن المحتمل أن يكون لدينا بعض ذاكرات التخزين المؤقت المحسّنة التي ربما نريدها ، ولا توفر Python على حد علمي أي آلية لصنع لهم بسرعة في هذا المكان .

الحقيقة هي أن المترجمين الفرعيين الذين يستخدمهم wsgi افتراضيًا لا يدعمهم حجم معقول لنظام الامتداد C. وهذا لن يحدث في المستقبل المنظور. وإذا كان أي شخص يعتقد أو يتوقع هذا باعتباره شيئًا مهمًا في خارطة طريق NumPy ، ففي رأيي أخطأ مطورو Python في إشاراتهم (وقد قلت ذلك ، ويبدو أنه تم الاعتراف بها هناك). لأنهم يجب أن يخبروا الجميع أنه يجب افتراض فشل المترجمين الفرعيين بشكل رهيب مع الغالبية العظمى من امتدادات C ، وأنه لا ينبغي لأحد أن يتوقع تغيير الوضع في منتصف المدة (السنوات القليلة المقبلة) ، وبشكل أساسي أن الميزة تجريبية عندما يتعلق الأمر بدعم الامتداد C.

نعم ، يتحرك العديد من مطوري نواة Python بسعادة في اتجاه جعل الأشياء تعمل ، ولكن من منظور مشروع مثل NumPy ، فإن دعم المترجمين الفرعيين (افتراضات wsgi) ليس أسهل من الانتقال من Python 2 إلى Python 3 مع جزء صغير من المستخدمين المحتملين ولا حتى التكنولوجيا لدعم كل شيء بشكل صحيح في الوقت الحالي!

لذا ، بعد هذا التشدق ... سأغلق هذا ، إذا أراد أي شخص بذل الجهد في جعل NumPy يعمل (أفضل مع المترجمين الفرعيين) فهذا جهد نبيل. ويسعدني أن أكون مخطئًا ... لكنني أؤيد النقطة التي مفادها أن المترجمين الفوريين (WSGI) ، يجب اعتبارهم تجريبيًا وميزة . أي إذا كنت تستخدم مترجمين فرعيين ، فإن الأمر أشبه باستخدام بعض تطبيقات Python الهامشية (مثل PyPy المبكر). وقد استغرق الأمر سنوات قبل أن يتوقع أي شخص يستخدم PyPy تشغيل NumPy داخل PyPy (وقام PyPy بكل العمل لتحقيق ذلك) ...

إيه ، أوافق تمامًا على أننا لا نهتم بالمترجمين الفوريين (حتى الآن على أي حال) ، لكن هذه مشكلة أبسط - لقد نجحت في 1.15.4 وتقارير Django و Spyder وما إلى ذلك لا تتضمن uwsgi . سآخذ خطوة سريعة في تغيير مرفق docstring في __array_function__ .

غاب صحيح هؤلاء. على الرغم من أنني أتساءل هناك أيضًا ... يجب أن يكون آمنًا إلى حد ما في هذا السياق. بمعنى أنه نأمل فقط في تسريب الذاكرة. (ما زلت أتساءل قليلاً عما إذا كان يجب على Spyder ألا يتخطى وحدات الامتداد C فقط ، على الأقل حتى يحصل CPython على المزيد من الآلات ليقول إن وحدة الامتداد C تنفذها بأمان ... وحتى ذلك الحين ، بالنسبة لمعظم وحدات الامتداد C التي يتم إعادة تحميلها ربما لا يفعل شيئًا تقريبًا).

وحتى مع ذلك ، فإن إعادة تحميل وحدات الامتداد C ربما لا تفعل شيئًا تقريبًا).

لا أعتقد أن هذا هو بيت القصيد. من الأسهل بكثير قول reload(any_module) بدلاً من معرفة ذلك قبل محاولة ذلك إذا كان هناك بعض الامتدادات المجمعة معلقة كجزء من حزمة Python.

لست متأكدًا مما يفعله Django بالضبط ، لكن من المحتمل أن يكون مشابهًا.

لم أكن أريد أن أزعجك كثيرًا.

لدي خدمة ويب تستخدم Flask و Numpy ، أعتقد أنني لست الوحيد.
ليس لدي أي أخطاء مع خادم التطوير (بالتأكيد Werkzeug) المتضمن في Flask.

وبالفعل ، في الإنتاج ، أستخدم وحدة apache2 WSGI لـ Python3 ، والتي تسمح لي بالحمل (عدة خيوط)

أنا منفتح ، أخبرني ماذا أستخدم:

شكرا جزيلا.

يجب أن يكون أي شيء في فقرة الترجمة الفورية نصيحة سليمة فيما يتعلق بـ NumPy. لا يمكنني تقديم أي نصيحة حول ما قد يصلح لخدمات الويب ، ولكن ربما يمكن لشخص آخر في هذا الموضوع.

أردت فقط أن أوضح أن جعل الوضع أفضل قليلاً قد يكون جيدًا (ويساعد البعض) ، لكنه لن يحل المشاكل العميقة في المستقبل المنظور. على أي حال ، أعتقد أننا قد نحاول إزالة هذا الفشل ولكن بدلاً من ذلك نقدم تحذيرًا كبيرًا بأن هذا قد يؤدي إلى صعوبة تصحيح الأخطاء.

ربما سيساعد شخصًا ما كما لم يتم ذكره من قبل:
أنا أستخدم uwsgi (مع Nginx) وحل " مترجم واحد = صحيح " ini config (أو مفتاح مترجم واحد ) هذه المشكلة بالنسبة لي .

هنا وجدت تفسير هذا العلم:

بشكل افتراضي ، ستقوم uWSGI بتنفيذ كود Python داخل مترجم فرعي للعملية بدلاً من مترجم Python الرئيسي الذي تم إنشاؤه عند تهيئة Python لأول مرة. يتم ذلك للسماح بتشغيل عدة تطبيقات ويب Python منفصلة ضمن عملية واحدة ولكن يجب فصلها بشكل كافٍ حتى لا تتداخل مع بعضها البعض. يمكن أن تفشل الإصدارات الأقدم من uWSGI عند استخدام مترجمين فرعيين مع تمكين مؤشر الترابط. لذلك من الأكثر أمانًا استخدام هذا الخيار وقصر نفسك على تطبيق ويب واحد لكل عملية. يعد تشغيل تطبيق ويب واحد في كل عملية باستخدام uWSGI حالة الاستخدام العادية ، لذا فمن غير المحتمل أن يمثل هذا التقييد مشكلة.

كحل بديل يمكنك التبديل إلى uwsgi باستخدام هذا التكوين أو محاولة العثور على شيء مشابه لبيئتك.

سيتم إعادة الفتح حتى ندمج بالفعل إصلاحًا / حلًا بديلًا - يجب أن يتم قريبًا.

لقد حدث لي هذا الخطأ نفسه أمس ، ولم أتمكن من معرفة ما حدث. فقط من أجل الإكمال ، كان لدي سبب هنا: كان لدي وحدة تسجيل ، تسمى logger.py ، كانت تقوم بالكتابة فوق شيء ما داخل Numpy. تم تغيير اسم الوحدة ، ولا توجد أخطاء. ربما سيصادف شخص آخر هذا التعليق ويكتشف أن شيئًا مشابهًا يحدث له.

لقد دفعنا لإصلاح 1.19. أو ربما حل بديل ، لأن الخطأ لا يزال يشير إلى حدوث شيء ما قد يؤدي إلى حدوث مشكلات.

seberg مع الحل البديل في 1.19 هل يجب إغلاق هذا؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

kevinzhai80 picture kevinzhai80  ·  4تعليقات

marcocaccin picture marcocaccin  ·  4تعليقات

dmvianna picture dmvianna  ·  4تعليقات

inducer picture inducer  ·  3تعليقات

dcsaba89 picture dcsaba89  ·  3تعليقات