Ipython: ์ถฉ๋Œ ์˜ค๋ฅ˜

์— ๋งŒ๋“  2021๋…„ 01์›” 20์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ipython/ipython

[3]์—์„œ: nn.relu
์—ญ์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
get_completions์˜ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/ptutils.py" ์ค„ 113 ํŒŒ์ผ
self._get_completions(body, offset, cursor_position, self.ipy_completer)์—์„œ ์‚ฐ์ถœ
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/ptutils.py", 129ํ–‰, _get_completions
์™„๋ฃŒ ์‹œ c์˜ ๊ฒฝ์šฐ:
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/core/completer.py", 438ํ–‰, _deduplicate_completions
์™„๋ฃŒ = ๋ชฉ๋ก(์™„๋ฃŒ)
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/core/completer.py", 1818ํ–‰, ์™„๋ฃŒ
self._completions(ํ…์ŠคํŠธ, ์˜คํ”„์…‹, _timeout=self.jedi_compute_type_timeout/1000)์—์„œ c์˜ ๊ฒฝ์šฐ:
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/core/completer.py", ๋ผ์ธ 1862, _completions
full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column)
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/core/completer.py", ๋ผ์ธ 2030, _complete
cursor_pos, cursor_line, ์ „์ฒด ํ…์ŠคํŠธ)
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/core/completer.py", ๋ผ์ธ 1374, _jedi_matches
ํ…์ŠคํŠธ[:์˜คํ”„์…‹], ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ์—ด=cursor_column, ํ–‰=cursor_line + 1)
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/jedi/api/__init__.py", 726ํ–‰, __init__
ํ”„๋กœ์ ํŠธ=ํ”„๋กœ์ ํŠธ(๊ฒฝ๋กœ.cwd()), **kwds)
TypeError: __init__()์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ '์—ด'์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ญ์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/bin/ipython", 8ํ–‰, in
sys.exit(start_ipython())
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/__init__.py", 126ํ–‰, start_ipython
๋ฐ˜ํ™˜ launch_new_instance(argv=argv, *kwargs)launch_instance์˜ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/traitlets/config/application.py" ํŒŒ์ผ, 845ํ–‰์•ฑ ์‹œ์ž‘()ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/ipapp.py", 356ํ–‰, ์‹œ์ž‘ ์‹œself.shell.mainloop()ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", ๋ผ์ธ 564, ๋ฉ”์ธ ๋ฃจํ”„self.interact()ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", 547ํ–‰, ์ƒํ˜ธ์ž‘์šฉ์ฝ”๋“œ = self.prompt_for_code()ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", 475ํ–‰, prompt_for_code* self._extra_prompt_options())
ํ”„๋กฌํ”„ํŠธ์—์„œ ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", 1013ํ–‰
๋ฐ˜ํ™˜ self.app.run(set_exception_handler=set_exception_handler)
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/application/application.py", 817ํ–‰, ์‹คํ–‰ ์ค‘
self.run_async(pre_run=pre_run, set_exception_handler=set_exception_handler)
run_until_complete์—์„œ ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/asyncio/base_events.py", 584ํ–‰
future.result()๋ฅผ ๋ฐ˜ํ™˜
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/application/application.py", 783ํ–‰, run_async
๋ฐ˜ํ™˜ ๋Œ€๊ธฐ _run_async2()
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/application/application.py", 771ํ–‰, _run_async2
self.cancel_and_wait_for_background_tasks()๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/application/application.py", ๋ผ์ธ 872, cancel_and_wait_for_background_tasks
์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/buffer.py", ์ค„ 1854, new_coroutine
์ฝ”๋ฃจํ‹ด( a, * kw)์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/buffer.py", ๋ผ์ธ 1684, async_completer
๋ฌธ์„œ, complete_event
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/completion/base.py", 270ํ–‰, get_completions_async
๋ฌธ์„œ, complete_event
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/prompt_toolkit/completion/base.py", get_completions_async์˜ 196ํ–‰
self.get_completions(document, complete_event)์˜ ํ•ญ๋ชฉ:
ํŒŒ์ผ "/home/hcl/miniconda3/envs/pytorch/lib/python3.7/site-packages/IPython/terminal/ptutils.py", get_completions์˜ 116ํ–‰
exc_type, exc_value, exc_tb = sys.exc_info()
NameError: 'sys' ์ด๋ฆ„์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด IPython 7.19.0 ๋ฒ„๊ทธ๋ผ๊ณ  ์˜์‹ฌ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์—์„œ ๋ณด๊ณ ํ•˜์„ธ์š”.
https://github.com/ipython/ipython/issues
๋˜๋Š” [email protected] ์˜ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋กœ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

"%tb"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ž์„ธํ•œ ํŠธ๋ ˆ์ด์Šค๋ฐฑ์„ ์ง€๊ธˆ ์ธ์‡„ํ•˜๊ฑฐ๋‚˜ "%debug"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€ํ™”์‹์œผ๋กœ ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ๋ณด๊ณ  ๋ชฉ์ ์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์„ธ๋ถ€ ์—ญ์ถ”์ ์€ ๋‹ค์Œ์„ ํ†ตํ•ด ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
%config Application.verbose_crash=์ฐธ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ญ์ถ”์  ์ฝ๊ธฐ:

  1. sys ๋ฐ traceback ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ IPython/terminal/ptutils.py ์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด Ipython ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  2. jedi/api/__init__.py ์—์„œ "column" ์ธ์ˆ˜๊ฐ€ Script.__init__ ์— ์ „๋‹ฌ๋˜์–ด ์ด๋Ÿฌํ•œ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด ์˜ค๋ฅ˜๋Š” IPython/core/completer.py ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 1373๋ฒˆ์งธ ์ค„์— ์ƒˆ๋กœ์šด jedi.Interpreter ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  "์—ด" ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด ์งˆ์‹๋ฉ๋‹ˆ๋‹ค.

Script ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด jedi 0.17๊ณผ jedi 0.18 ์‚ฌ์ด์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
0.17์—์„œ:

     def __init__(self, code=None, line=None, column=None, path=None,                                    
                 encoding=None, sys_path=None, environment=None,                                               
                 project=None, source=None):

0.18์—์„œ:

    def __init__(self, code=None, *, path=None, environment=None, project=None):

jedi 0.18 ๋Œ€์‹  jedi 0.17์„ ์„ค์น˜ํ•˜๋ฉด ํ˜„์žฌ ๋ฒ„์ „์˜ ipython์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

pip uninstall jedi
pip install jedi==0.17.2

๋ชจ๋“  4 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ์˜ ์›์ธ์€ ipython ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ jedi ํŒจํ‚ค์ง€์—์„œ ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ipython์—๋„ ์ด์™€ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. $# get_completions sys ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

sys ๋ฐ traceback ๋ชจ๋“ˆ์€ 7๊ฐœ์›” ์ „์— ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ pypi์—์„œ๋Š” ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์ด ์˜ค๋ฅ˜๋Š” ipython๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. jedi ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด jedi ์˜ ๋ฌธ์ œ์ธ ์ด์œ ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
PyPI์˜ ์ตœ์‹  ipython ๋ฆด๋ฆฌ์Šค๋Š” ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋งˆ์Šคํ„ฐ์—์„œ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ๋ฆด๋ฆฌ์Šค๋˜์ง€ ์•Š์€ ๋ˆ„๋ฝ๋œ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํฌํ•จ๋œ 7.19.0์ž…๋‹ˆ๋‹ค.
https://github.com/ipython/ipython/blob/7.19.0/IPython/terminal/ptutils.py

sys ์ˆ˜์ž… ์—†์Œ
https://github.com/ipython/ipython/blob/223e783c447a773a497809646ca0d874ea10ceeb/IPython/terminal/ptutils.py#L20 -L24

sys ์˜ ์‚ฌ์šฉ
https://github.com/ipython/ipython/blob/223e783c447a773a497809646ca0d874ea10ceeb/IPython/terminal/ptutils.py#L116

์—ญ์ถ”์  ์ฝ๊ธฐ:

  1. sys ๋ฐ traceback ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ IPython/terminal/ptutils.py ์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด Ipython ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  2. jedi/api/__init__.py ์—์„œ "column" ์ธ์ˆ˜๊ฐ€ Script.__init__ ์— ์ „๋‹ฌ๋˜์–ด ์ด๋Ÿฌํ•œ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด ์˜ค๋ฅ˜๋Š” IPython/core/completer.py ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 1373๋ฒˆ์งธ ์ค„์— ์ƒˆ๋กœ์šด jedi.Interpreter ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  "์—ด" ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด ์งˆ์‹๋ฉ๋‹ˆ๋‹ค.

Script ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด jedi 0.17๊ณผ jedi 0.18 ์‚ฌ์ด์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
0.17์—์„œ:

     def __init__(self, code=None, line=None, column=None, path=None,                                    
                 encoding=None, sys_path=None, environment=None,                                               
                 project=None, source=None):

0.18์—์„œ:

    def __init__(self, code=None, *, path=None, environment=None, project=None):

jedi 0.18 ๋Œ€์‹  jedi 0.17์„ ์„ค์น˜ํ•˜๋ฉด ํ˜„์žฌ ๋ฒ„์ „์˜ ipython์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

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