Numpy: RuntimeError: metode implement_array_function sudah memiliki docstring

Dibuat pada 28 Agu 2019  ·  20Komentar  ·  Sumber: numpy/numpy

Contoh kode reproduksi:

from flask import Flask

import numpy

app = Flask(__name__)

sebagai aplikasi uwsgi.

Lingkungan penuh: https://github.com/luckydonald-archive/numpy-issues-14384/

Pesan eror:

|> 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

Informasi versi Numpy/Python:

Baru dipasang numpy , 28-08-2019.

57 - Close?

Komentar yang paling membantu

Menurunkan numpy ke numpy==1.15.4 berhasil untuk saya.

Semua 20 komentar

Setelah beberapa pengujian, saya cukup yakin itu terkait dengan dijalankan dalam uwsgi .

Ini membunyikan lonceng yang tidak jelas. IIRC uwsgi melakukan semacam manipulasi docstring, seperti menjalankan dengan -OO .

Ini juga terjadi di Spyder, yang menggunakan IPython untuk konsol Python-nya. Mereka memiliki teknik yang disebut "user module reloader", yang "memaksa Python untuk memuat ulang modul yang diimpor saat menjalankan file di konsol Python atau IPython". Pada dasarnya ini del sys.modules[modname] .

Saat mencoba menjalankan skrip yang mengimpor numpy, saya mendapatkan jejak tumpukan yang diakhiri dengan

[...]
impor numpy sebagai np

File "C:\Program Files\Python35\lib\site-packagesnumpy\__init__.py", baris 142, di
dari . inti impor

File "C:\Program Files\Python35\lib\site-packagesnumpy\core\__init__.py", baris 17, di
dari . impor multiarray

File "C:\Program Files\Python35\lib\site-packagesnumpy\core\multiarray.py", baris 14, di
dari . impor menimpa

File "C:\Program Files\Python35\lib\site-packagesnumpy\core\overrides.py", baris 47, di
""")

RuntimeError: metode implement_array_function sudah memiliki docstring

Terjadi pada saya juga (server 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

Python 7.3.7
numpy: 1.17.2

Masalah sebenarnya di sini adalah NumPy tidak mendukung inisialisasi ulang dalam prosesnya. Ini kembali ke gh-665 dari tahun 2012. Memecahkan ini akan membutuhkan secara hati-hati menangkap semua keadaan global yang kita buat dalam sebuah struct, dan mengaksesnya melalui pengambil pada modul.

Oh, global. Itu selalu menyenangkan.

Menurunkan numpy ke numpy==1.15.4 berhasil untuk saya.

Menurunkan numpy ke numpy==1.15.4 berhasil untuk saya.

Versi numpy (1.15.4) ini berfungsi dengan panda versi penyihir?
Karena dengan panda 1.0.3 =
ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C header, got 192 from PyObject

Pertanyaan lain, apakah menurut Anda bug ini akan segera diperbaiki?

Terima kasih banyak.

Pertanyaan lain, apakah menurut Anda bug ini akan segera diperbaiki?

Jika dengan "bug ini" yang Anda maksud mengizinkan numpy untuk dihapus dan diimpor ulang, maka jawabannya adalah "Itu tidak ada di peta jalan kami". Ini adalah open source sehingga siapa pun dapat berkontribusi untuk memperbaikinya, tetapi ini akan menjadi usaha yang agak besar.

Jika yang Anda miliki hanyalah peringatan impor, maka Anda dapat mengabaikannya. Tapi saya kira Anda menggunakan uwsgi ...

Jika ini karena uwsgi, maka saya hanya punya jawaban bahwa kami tidak akan mendukungnya dan Anda harus melakukan upaya yang sangat signifikan dalam hal ini. Saat ini bahkan tidak semua Python yang tepat mendukung ini, mereka sedang mengerjakannya dengan harapan yang tidak jelas bahwa suatu hari itu akan berhasil. Tetapi meminta kami untuk membuat pekerjaan ini tidak akan ke mana-mana. Tentu, Anda dapat mencoba menginvestasikan waktu dan uang untuk memperbaiki situasi, itu diterima, tetapi jangan terlalu berharap.

Setelah Python menyelesaikan masalah mereka (ini mungkin memakan waktu cukup lama, mereka mengerjakan ini selama bertahun- tahun) dan ada basis pengguna yang cukup besar mungkin ada minat di dalamnya.
Saat ini, kami memiliki API publik yang sepengetahuan saya pada dasarnya tidak sesuai dengan apa yang dilakukan wsgi (menggunakan sub-interpreter), dan kami mungkin memiliki beberapa cache yang dioptimalkan yang mungkin kami inginkan dan Python setahu saya belum menyediakan mekanisme apa pun untuk membuat mereka cepat dalam pengaturan ini .

Faktanya adalah bahwa sub-interpreter yang digunakan wsgi secara default sama sekali tidak didukung oleh ukuran yang wajar dari sistem ekstensi-C. Dan ini tidak akan terjadi di masa mendatang. Dan jika ada yang berpikir atau mengharapkan ini sebagai hal penting dari peta jalan NumPy, maka menurut saya pengembang Python salah memberi sinyal (dan saya telah mengatakannya, dan tampaknya diakui di sana). Karena mereka harus memberi tahu semua orang bahwa sub-penerjemah harus dianggap gagal total dengan sebagian besar ekstensi C, bahwa tidak ada yang mengharapkan situasi berubah dalam jangka menengah (beberapa tahun ke depan), dan pada dasarnya fitur itu eksperimental ketika datang ke dukungan C-ekstensi.

Ya, banyak pengembang inti Python dengan senang hati bergerak ke arah membuat sesuatu bekerja, tetapi dari perspektif proyek seperti NumPy, mendukung sub-interpreter (wsgi default) tidak lebih mudah daripada transisi Python 2 ke Python 3 dengan sebagian kecil dari pengguna potensial dan saat ini bahkan bukan teknologi untuk mendukung semuanya dengan benar!

Jadi, setelah kata-kata kasar ini... Saya akan menutup ini, jika ada yang ingin menghabiskan upaya untuk membuat NumPy bekerja (lebih baik dengan sub-interpreter) itu adalah upaya yang mulia. Dan saya senang terbukti salah ... Tapi saya berdiri dengan poin bahwa sub-interpreter (wsgi), harus dianggap sebagai eksperimental dan fitur . Yaitu jika Anda menggunakan sub-interpreter, itu lebih seperti menggunakan beberapa implementasi Python pinggiran (seperti PyPy awal). Dan butuh bertahun-tahun sebelum siapa pun yang menggunakan PyPy diharapkan dapat menjalankan NumPy di ​​dalam PyPy (dan PyPy melakukan semua pekerjaan untuk mewujudkannya)...

Eh, saya sepenuhnya setuju bahwa kita tidak peduli dengan subinterpreter (namun bagaimanapun juga), tetapi ini adalah masalah yang lebih sederhana - ini bekerja di 1.15.4 dan laporan Django, Spyder, dll. tidak melibatkan uwsgi . Saya akan segera mengubah lampiran docstring di __array_function__ .

Benar merindukan mereka. Meskipun saya juga bertanya-tanya di sana... seharusnya cukup aman dalam konteks itu. Dalam arti semoga hanya membocorkan memori. (Saya masih sedikit bertanya-tanya apakah Spyder tidak boleh melewatkan modul ekstensi-C, setidaknya sampai CPython mendapatkan lebih banyak mesin untuk mengatakan bahwa modul ekstensi-C mengimplementasikannya dengan aman... Dan bahkan kemudian, untuk sebagian besar modul ekstensi-C memuat ulang mungkin hampir tidak melakukan apa-apa).

Dan bahkan kemudian, untuk sebagian besar modul C-ekstensi, memuat ulang mungkin hampir tidak melakukan apa-apa).

Saya tidak berpikir itu intinya. Jauh lebih mudah untuk mengatakan reload(any_module) daripada mencari tahu sebelum mencobanya jika ada beberapa ekstensi yang dikompilasi berkeliaran sebagai bagian dari paket Python.

Tidak yakin persis apa yang Django lakukan, tapi mungkin mirip.

Aku tidak ingin mengganggu Anda terlalu banyak.

Saya memiliki layanan web yang menggunakan Flask dan Numpy, saya kira saya bukan satu-satunya.
Saya tidak memiliki kesalahan dengan server pengembangan (tentu saja Werkzeug) yang disertakan dalam Flask.

Dan memang, dalam produksi, saya menggunakan modul WSGI Apache2 untuk Python3, yang memungkinkan saya untuk menahan beban (beberapa utas)

Saya terbuka, beri tahu saya apa yang harus digunakan:

Terima kasih banyak.

Apa pun dalam paragraf sub-penerjemah harus menjadi nasihat yang baik sehubungan dengan NumPy. Saya tidak dapat memberikan saran apa pun tentang apa yang mungkin berfungsi untuk layanan web, tetapi mungkin orang lain di utas ini bisa.

Saya hanya ingin memperjelas bahwa membuat situasi sedikit lebih baik mungkin baik (dan membantu beberapa orang), tetapi tidak akan menyelesaikan masalah terdalam di masa mendatang. Bagaimanapun, saya kira kami dapat mencoba untuk menghapus kegagalan ini tetapi sebaliknya memberikan peringatan besar bahwa ini dapat menyebabkan masalah yang sulit untuk di-debug.

Mungkin itu akan membantu seseorang karena tidak disebutkan sebelumnya:
Saya menggunakan uwsgi (dengan Nginx) dan " single-interpreter = true " ini config (atau --single-interpreter switch) memecahkan masalah ini untuk saya .

Di sini saya menemukan penjelasan dari bendera ini:

Secara default uWSGI akan mengeksekusi kode Python dalam sub interpreter dari proses daripada interpreter Python utama yang dibuat saat Python pertama kali diinisialisasi. Hal ini dilakukan untuk memungkinkan beberapa aplikasi web Python yang terpisah dijalankan dalam satu proses tetapi harus cukup dipisahkan agar tidak saling mengganggu. Versi uWSGI yang lebih lama dapat gagal saat menggunakan sub interpreter dengan threading diaktifkan. Oleh karena itu, paling aman untuk menggunakan opsi ini dan membatasi diri Anda pada satu aplikasi web per proses. Menjalankan satu aplikasi web di setiap proses dengan uWSGI adalah kasus penggunaan normal sehingga pembatasan ini tidak akan menjadi masalah.

Jadi sebagai solusinya, Anda dapat beralih ke uwsgi dengan konfigurasi ini atau mencoba menemukan sesuatu yang serupa untuk lingkungan Anda.

Akan dibuka kembali sampai kami benar-benar menggabungkan perbaikan/solusi - harus segera.

Saya mengalami kesalahan yang sama terjadi pada saya kemarin, dan saya tidak dapat mengetahui apa yang telah terjadi. Demi penyelesaian, saya akan memiliki tujuan saya di sini: Saya memiliki modul logger, bernama logger.py, yang menimpa sesuatu di dalam Numpy. Mengubah nama modul, tidak ada kesalahan. Mungkin orang lain akan menemukan komentar ini dan mengetahui hal serupa terjadi pada mereka.

Kami telah mendorong perbaikan untuk 1,19. Atau mungkin lebih tepatnya solusi, karena kesalahan masih menunjukkan bahwa ada sesuatu yang terjadi yang mungkin menimbulkan masalah.

@seberg dengan solusi di 1.19 haruskah kita menutup ini?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

manuels picture manuels  ·  3Komentar

ghost picture ghost  ·  4Komentar

Kreol64 picture Kreol64  ·  3Komentar

toddrjen picture toddrjen  ·  4Komentar

astrofrog picture astrofrog  ·  4Komentar