Numpy: RuntimeError:implement_array_function ๋ฉ”์†Œ๋“œ์— ์ด๋ฏธ docstring์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 08์›” 28์ผ  ยท  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 ๋Š” -OO ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ผ์ข…์˜ ๋…์ŠคํŠธ๋ง ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” Python ์ฝ˜์†”์— IPython์„ ์‚ฌ์šฉํ•˜๋Š” Spyder์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ "ํŒŒ์ด์ฌ์ด๋‚˜ 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ํ–‰,
""")

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
์ˆซ์ž: 1.17.2

์—ฌ๊ธฐ์„œ ์ง„์งœ ๋ฌธ์ œ๋Š” NumPy๊ฐ€ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 2012๋…„์˜ gh-665๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ตฌ์กฐ์ฒด์—์„œ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ „์—ญ ์ƒํƒœ๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๋ชจ๋“ˆ์˜ getter๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค, ๊ธ€๋กœ๋ฒŒ. ๊ทธ๊ฒƒ๋“ค์€ ํ•ญ์ƒ ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค.

numpy๋ฅผ numpy==1.15.4๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ํŠธ๋ฆญ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

numpy๋ฅผ numpy==1.15.4๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ํŠธ๋ฆญ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฒ„์ „์˜ numpy(1.15.4)๋Š” pandas์˜ ๋งˆ๋…€ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
ํŒฌ๋” 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 ์—์„œ๋„ ์ด๋ฅผ ์ง€์›ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ํฌ๋ง์„ ๊ฐ€์ง€๊ณ  ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์—๊ฒŒ ์ด ์ผ์„ ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„๊ณผ ๋ˆ์„ ํˆฌ์žํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํฌ๋ง์„ ๊ฐ€์ง€์ง€๋Š” ๋งˆ์‹ญ์‹œ์˜ค.

ํŒŒ์ด์ฌ์€ ์ตœ์ข… ํ•จ๊ป˜ ์ž์‹ ์˜ ์ผ์„ ์–ป๋Š”๋‹ค ํ›„ (์ด๊ฒƒ์€ ๋‹ค์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋“ค์€ ๋ช‡ ๋…„ ๋™์•ˆ์ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) ๊ฑฐ๊ธฐ์— ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํฐ userbase๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” wsgi๊ฐ€ ํ•˜๋Š” ์ผ(ํ•˜์œ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์‚ฌ์šฉ)๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ณต๊ฐœ API๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ตœ์ ํ™”๋œ ์บ์‹œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ Python ์€ ์•„์ง ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์„ค์ •์—์„œ ๋น ๋ฅด๊ฒŒ .

์‚ฌ์‹ค wsgi๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ํฌ๊ธฐ์˜ C ํ™•์žฅ ์‹œ์Šคํ…œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ NumPy ๋กœ๋“œ๋งต์˜ ์ค‘์š”ํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด, ์ œ ์ƒ๊ฐ์—๋Š” Python ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ํ˜ธ๋ฅผ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์€ ์„œ๋ธŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋Œ€๋‹ค์ˆ˜์˜ C ํ™•์žฅ์—์„œ ๋”์ฐํ•˜๊ฒŒ ์‹คํŒจํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•˜๊ณ , ์•„๋ฌด๋„ ์ƒํ™ฉ์ด ์ค‘๊ธฐ(ํ–ฅํ›„ ๋ช‡ ๋…„)์— ๋ฐ”๋€” ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์‹คํ—˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ C ํ™•์žฅ ์ง€์›์— ์˜จ๋‹ค.

์˜ˆ, ๋งŽ์€ Python ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…์„ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ–‰๋ณตํ•˜๊ฒŒ ์›€์ง์ด๊ณ  ์žˆ์ง€๋งŒ NumPy์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์˜ ๊ด€์ ์—์„œ ํ•˜์œ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(wsgi ๊ธฐ๋ณธ๊ฐ’)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ž ์žฌ์ ์ธ ์‚ฌ์šฉ์ž์™€ ํ˜„์žฌ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค!

๊ทธ๋ž˜์„œ, ์ด ํ˜ธ์–ธ์žฅ๋‹ด ์ดํ›„์—... ๋ˆ„๊ตฐ๊ฐ€ NumPy๊ฐ€ (์„œ๋ธŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ ํ•จ๊ป˜ ๋” ์ž˜ ์ž‘๋™ํ•˜๋„๋ก) ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๊ณ ๊ท€ํ•œ ๋…ธ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์ด ์ฆ๋ช…๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์„œ๋ธŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(wsgi) ๊ฐ€ ์‹คํ—˜์ ์ด๊ณ  ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ๋™์˜

์–ด, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ (์•„์ง ์–ด์จŒ๋“ ) ์„œ๋ธŒ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 1.15.4์—์„œ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ Django, Spyder ๋“ฑ์˜ ๋ณด๊ณ ์„œ์—๋Š” uwsgi ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. __array_function__ ์˜ ๋…์ŠคํŠธ๋ง ์ฒจ๋ถ€ ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์€ ๊ทธ๊ฒƒ๋“ค์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ๋Œ€ํ•ด์„œ๋„ ๊ถ๊ธˆํ•˜์ง€๋งŒ ... ๊ทธ ๋งฅ๋ฝ์—์„œ ์ƒ๋‹นํžˆ ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฌ๋ง์ ์œผ๋กœ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ˆ„์ถœํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ. (์ตœ์†Œํ•œ CPython์ด C-ํ™•์žฅ ๋ชจ๋“ˆ์ด ๊ทธ๊ฒƒ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๋” ๋งŽ์€ ๊ธฐ๊ณ„๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ Spyder๊ฐ€ C-ํ™•์žฅ ๋ชจ๋“ˆ์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด ์•ˆ ๋˜๋Š”์ง€ ์•ฝ๊ฐ„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ C-ํ™•์žฅ ๋ชจ๋“ˆ์ด ๋‹ค์‹œ ๋กœ๋“œ๋˜๋Š” ๊ฒฝ์šฐ ์•„๋งˆ ๊ฑฐ์˜ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๊ทธ๋Ÿฐ ๋‹ค์Œ์—๋„ ๋Œ€๋ถ€๋ถ„์˜ C ํ™•์žฅ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ์žฌ๋กœ๋”ฉ์€ ๊ฑฐ์˜ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๊ทธ๊ฒŒ ํ•ต์‹ฌ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์š”. reload(any_module) ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด Python ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€๋กœ ์ปดํŒŒ์ผ๋œ ํ™•์žฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์ „์— ์•Œ์•„๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Django๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์•„๋งˆ๋„ ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์„ ๋„ˆ๋ฌด ๊ท€์ฐฎ๊ฒŒํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Flask์™€ Numpy๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋งŒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Flask์— ํฌํ•จ๋œ ๊ฐœ๋ฐœ ์„œ๋ฒ„(ํ™•์‹คํžˆ Werkzeug)์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ํ”„๋กœ๋•์…˜์—์„œ๋Š” Python3์šฉ apache2 WSGI ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋“œ(์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ)๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์œ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋‹จ๋ฝ์˜ ๋ชจ๋“  ๋‚ด์šฉ์€ NumPy์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฑด์ „ํ•œ ์กฐ์–ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์›น ์„œ๋น„์Šค์— ์–ด๋–ค ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„์ง€์— ๋Œ€ํ•ด ์–ด๋–ค ์กฐ์–ธ๋„ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋Š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ์„ ์กฐ๊ธˆ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ(๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€๋Š” ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ) ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ์ด ์‹คํŒจ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€์‹  ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ํฐ ๊ฒฝ๊ณ ๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „์— ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” uwsgi (Nginx์™€ ํ•จ๊ป˜)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ " single-interpreter = true " ini config(๋˜๋Š” --single-interpreter ์Šค์œ„์น˜) ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค .

์—ฌ๊ธฐ ์—์„œ ์ด ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ uWSGI๋Š” Python์ด ์ฒ˜์Œ ์ดˆ๊ธฐํ™”๋  ๋•Œ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค์˜ ํ•˜์œ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋‚ด์—์„œ Python ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐœ๋ณ„ Python ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๋„๋ก ์ถฉ๋ถ„ํžˆ ๋ถ„๋ฆฌ๋˜๋„๋ก ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šค๋ ˆ๋”ฉ์ด ํ™œ์„ฑํ™”๋œ ํ•˜์œ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด์ „ ๋ฒ„์ „์˜ uWSGI๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋‹น ๋‹จ์ผ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. uWSGI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹จ์ผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๋ฏ€๋กœ ์ด ์ œํ•œ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ uwsgi๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ™˜๊ฒฝ์— ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹ค์ œ๋กœ ๋ณ‘ํ•ฉํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ์—ด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ณง ์ œ๊ณต๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์–ด์ œ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๋‚ด ์›์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Numpy ๋‚ด๋ถ€์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฎ์–ด์“ฐ๋Š” logger.py๋ผ๋Š” ๋กœ๊ฑฐ ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋Œ“๊ธ€์„ ๋ณด๊ณ  ๋น„์Šทํ•œ ์ผ์ด ๊ทธ๋“ค์—๊ฒŒ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1.19์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์ง„ํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@seberg 1.19์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰