docker 的 Jupyter:__init__() 得到了一个意外的关键字参数 'column'

Jupyter with docker: __init__() got an unexpected keyword argument 'column'

我最近安装了支持 GPU 的 TensorFlow docker:

docker pull tensorflow/tensorflow:latest-gpu-jupyter

但有时当我使用以下命令启动 jupyter notebook 服务器时:

docker run --gpus all -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --allow-root --NotebookApp.allow_origin='https://colab.research.google.com'

我在终端上看到以下异常:

[IPKernelApp] ERROR | Exception in message handler:
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/ipykernel/kernelbase.py", line 272, in dispatch_shell
    yield gen.maybe_future(handler(stream, idents, msg))
  File "/usr/local/lib/python3.6/dist-packages/tornado/gen.py", line 762, in run
    value = future.result()
  File "/usr/local/lib/python3.6/dist-packages/tornado/gen.py", line 234, in wrapper
    yielded = ctx_run(next, result)
  File "/usr/local/lib/python3.6/dist-packages/tornado/gen.py", line 162, in _fake_ctx_run
    return f(*args, **kw)
  File "/usr/local/lib/python3.6/dist-packages/ipykernel/kernelbase.py", line 580, in complete_request
    matches = yield gen.maybe_future(self.do_complete(code, cursor_pos))
  File "/usr/local/lib/python3.6/dist-packages/ipykernel/ipkernel.py", line 348, in do_complete
    return self._experimental_do_complete(code, cursor_pos)
  File "/usr/local/lib/python3.6/dist-packages/ipykernel/ipkernel.py", line 373, in _experimental_do_complete
    completions = list(_rectify_completions(code, raw_completions))
  File "/usr/local/lib/python3.6/dist-packages/IPython/core/completer.py", line 484, in rectify_completions
    completions = list(completions)
  File "/usr/local/lib/python3.6/dist-packages/IPython/core/completer.py", line 1818, in completions
    for c in self._completions(text, offset, _timeout=self.jedi_compute_type_timeout/1000):
  File "/usr/local/lib/python3.6/dist-packages/IPython/core/completer.py", line 1862, in _completions
    full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column)
  File "/usr/local/lib/python3.6/dist-packages/IPython/core/completer.py", line 2030, in _complete
    cursor_pos, cursor_line, full_text)
  File "/usr/local/lib/python3.6/dist-packages/IPython/core/completer.py", line 1374, in _jedi_matches
    text[:offset], namespaces, column=cursor_column, line=cursor_line + 1)
  File "/usr/local/lib/python3.6/dist-packages/jedi/api/__init__.py", line 726, in __init__
    project=Project(Path.cwd()), **kwds)
TypeError: __init__() got an unexpected keyword argument 'column'

之后,我必须重新启动服务器或从 google colab 重新连接。

知道错误的来源以及如何解决吗?

这似乎是 jedi 和 ipython 之间的不兼容,参见 this issue

修复方法是将 jedi 固定到 0.17.2,因此 运行:

pip install jedi==0.17.2

或者,如果您使用的是诗歌,请将此添加到您的 pyproject.toml:

jedi = "<=0.17.2"

但是由于您使用的是 docker 图片,因此需要更新该图片。好像是gpu-jupyter.Dockerfile.

我会针对该项目提出一个问题,看看他们是否可以像 nbformat 那样固定 jedi,或者您可以将其分叉。他们也应该升级 python,3.6 有点老了。

我会在@daphtdazz 的回答中添加更多细节。我必须执行以下步骤来解决此问题:

1。从 github:

下载 TensorFlow
git clone https://github.com/tensorflow/tensorflow.git

2。编辑文件 gpu-jupyter.Dockerfile,在第 104 行末尾添加 jedi==0.17.2

vim tensorflow/tensorflow/tools/dockerfiles/dockerfiles/gpu-jupyter.Dockerfile 

3。将自己放在 dockerfiles 文件夹中:

cd tensorflow/tensorflow/tools/dockerfiles/

4。构建图像:

docker build -f ./dockerfiles/gpu-jupyter.Dockerfile -t tf .