pipx + python-lsp-server + pipenv in Emacs

以前寫過一篇 lsp-mode 與 Python virtualenv 的整合,但 Ubuntu 23.04 開始不能直接 pip install --user,這方法就不能用了。解決方式還算單純。

  1. 先把 pip list --user 有裝的東西紀錄下來,然後全砍掉。

  2. 文件建議,23.04 以上就直接 apt 裝。我還停在 22.04 只是想先換換看,所以用 pip install --user pipx.

  3. pipx install pipenv, pipx install python-lsp-server[all]

  4. 裝一些搭配 language server 的東西:pipx inject python-lsp-server python-lsp-black python-lsp-isort.

  5. 之前專案都是跑 pipenv install --site-packages, 現在不用了,全部重裝。

    1
    2
    cd ~/.local/share/virtualenvs/
    for F in */.project; do pushd $(cat $F); pipenv --rm; pipenv sync; popd; done
  6. 改寫 pylsp.sh, Emacs 裡面 lsp-pylsp-server-command 就用這取代。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash

    set -e

    if pipenv --venv &> /dev/null; then
    VENV=$(pipenv --venv)
    source "${VENV}/bin/activate"
    exec pylsp "$@"
    else
    exec pylsp "$@"
    fi

重點是先 activate venv 再跑 pylsp, 其實一開始用這方法就好了。