關於Jupyter Notebook無法自動補全(Autocompletion),報錯TypeError: __init__() got an unexpected keyword argument 'column' 的解決方案
問題描述:
最近在linux服務器上裝了jupyter notebook希望遠程訪問使用,安裝完成后發現notebook的TAB自動補全功能不能用。這是一件很難受的事情,python這么多庫的用法不可能一一記住,所以必須解決這個問題。
在谷歌百度上尋求解決方案,發現很多文章提到安裝nbextensions插件,但很遺憾,我嘗試之后發現這個方法無法解決問題。
最后我在pycharm上運行jupyter的時候發現了問題的根源。當在pycharm中輸入函數名並補全代碼時,jupyter的控制台會提示如下的錯誤(但由於pycharm的強大功能,此時仍然能夠完成代碼補全):
File "....../lib/python3.6/site-packages/jedi/api/__init__.py", line 726, in __init__
project=Project(Path.cwd()), **kwds)
TypeError: __init__() got an unexpected keyword argument 'column'
於是讓我聯想到,直接使用jupyter notebook時無法按TAB補全可能也是這個錯誤導致的。查看服務器上的jupyter日志發現似乎也有這個報錯。
最后,在github上ipython項目的issue中找到了解決方法:
https://github.com/ipython/ipython/issues/12740
解決方案:
該問題是ipython版本和jedi版本不符造成的(從錯誤提示中也能看出來與jedi有關)。
在這種情況下,直接從shell控制台運行ipython也不能使用TAB鍵補全,按下TAB沒有任何反應。
由於ipython 7.19及以下的版本不支持最新的jedi 0.18.0,就會出現錯誤。查看ipython版本,嗯,版本號7.16.1,那么問題就找到了。
由於我的Python版本是3.6.9,不能升級ipython到7.20以上(需要python3.7以上的版本),只能選擇從jedi入手。網上有博客稱jupyter使用不需要jedi所以可以直接卸載解決問題,我沒有嘗試是否可行。我這里選擇將jedi降低一個版本(到0.17.0),即可解決問題
pip3 install jedi==0.17.0
完成之后,先試試shell運行ipython,TAB鍵已經出現代碼提示和補全功能。然后打開jupyter notebook,同樣能夠使用TAB鍵補全了,問題解決!