[python] WSLのpipenv install時になぜかWindows側のpythonが呼ばれる件


概要

  • wslでリポジトリにpipenvをinstallしようとするとなぜかエラーが。。。
  • どうやらwindows側のpythonを参照している模様
  • pythonをフルパスで指定することでとりあえず対策完了

環境

  • Windows10 1909
  • wsl ubuntu 18.0LTS
  • pyenv 1.2.13-35-g22c0202
  • python 3.8.0
  • pipenv 2018.11.26

現象

python3.8になってから初めてWSLでプロジェクトにpipenv をinstallしようとしたら見慣れぬエラーが。。。

user@***:~/prj$ pipenv --python 3.8
# ~~中略~~
'TypeError: write() takes exactly one argument (3 given)\n']

ログをちゃんと読んだところ、どうもwindows側のpythonを読んでる模様

OSError: [Errno 8] Exec format error: '/mnt/c/Users/user/AppData/Local/Microsoft/WindowsApps/python.exe'

一旦、pythonを3.7.4に差し戻してみたが変わらず。。。

原因は、どうもこれっぽい#3488

このissue、ステートはcloseですが根本的には解決されていないっぽいです。

とりあえず急場しのぎ的な対策が載っていますので今回はそれで済ますことにしましょう

対策

やり方はいたってシンプル。installするpythonをバージョン指定ではなく、フルパスで直に指定します

# 【方法1】バージョン指定していれる場合(例:3.7.4)
#  パスはフルパスで指定してください(~/.pyenv...は不可)
pipenv install --python=/home/ユーザー名/.pyenv/versions/3.7.4/bin/python

# 【方法2】globalなpythonを入れる場合(止めておいた方がいい??)
pipenv install --python=$(which python)

ちょっと気になったのが、globalを切り替えたときにグローバルのpythonのファイル/home/ユーザー名/.pyenv/shims/pythonが差し変わるっぽいので、方法2だとpipenvが見てるpythonファイルが変わっていろいろ面倒なことになりそうという事。
やるなら方法1ですかねぇ(パス指定めんどくさい。。。)