2022年2月17日木曜日

pylsp で pipenv 配下にインストールしたモジュールの補完がされない場合の対処方法

pylsp で pipenv 配下にインストールしたモジュールの補完がされない場合の対処方法

概要

過去に emacs+pylsp の連携方法を紹介しました
今回は pipenv を使って pypi からインストールしたモジュールの補完を pylsp を使って行う方法を紹介します

環境

  • macOS 11.6.3
  • Python 3.9.10

pylsp を無理やり上書きする

グローバルにインストールした pylsp を pipenv 配下にインストールした pylsp で無理やり上書きします
具体的には以下のようにシンボリックリンクを貼れば OK です

  • cd /path/to/project
  • ln -sf $(pipenv --venv)/bin/pylsp /usr/local/bin/pylsp

ちなみに上記は pylsp のパスが上記の場合になります

$ which pylsp
/usr/local/bin/pylsp

ただこれの場合は1プロジェクトにしか対応できないのとプロジェクトを切り替えるたびにシンボリックリンクも切り替えなければいけないので大変です

pylsp 用に一つプロジェクトを作成してそこに補完してほしいモジュールをどんどんインストールするのもありかなと思います

pyenv 配下のプロジェクトの場合は別のファイルを上書きする

pyenv 配下のプロジェクトの場合 pylsp のスクリプトは一度別のスクリプトのスクリプトを経由するので which で表示されるスクリプトではなく実体のスクリプトを上書きしましょう

# which pylsp
/root/.pyenv/shims/pylsp

# pyenv version
3.10.1 (set by /root/.pyenv/version)

# ls /root/.pyenv/versions/3.10.1/bin/pylsp
/root/.pyenv/versions/3.10.1/bin/pylsp

# ln -sf $(pipenv --venv)/bin/pylsp /root/.pyenv/versions/3.10.1/bin/pylsp

グローバルな pip にインストールする

python-lsp-server が起動している pip 環境と同じ環境にモジュールをインストールします

これでも対応可能ですが補完が必要なモジュールがあるたびにグローバルな環境にモジュールをインストールする必要があります

また pipenv の環境間で同じモジュールのバージョン違いがある場合は補完候補が間違うことがあります

pyls_jsonrpc.endpoint - Received cancel notification for unknown message id

pylsp::stderr バッファーになぜかこれが出力されるケースがありました
これが出力されていると補完時に「No matches」と表示されて補完がうまく動作しません

原因は不明です

emacs の lsp-mode の対応に期待する

pylsp の設定で pipenv 配下の pylsp を実行するような設定が出てくるのを待ちましょう

もしくは自分で修正しましょう

最後に

emacs の lsp-mode の solargraph には bundler 配下にインストールした solargraph を使用するというオプションがあるのですが pylsp にはないので今回のような少しトリッキーな対応が必要になります

参考サイト

0 件のコメント:

コメントを投稿