pip installのバージョン指定が"zsh ~ not found"となる場合の回避策


はじめに

pip installをmacOS環境のzshにてバージョン指定で実行した際にエラーが出てしまったので、原因を調査してみました。
もし同じようなことにお悩みの方がいて解決の糸口になれば幸いです

pip install時に有効なパッケージのバージョンを調べる方法

久々にpythonをさわったので、まずは予備知識から。
意外と知らないバージョン検索方法です。

# pip install [package name]== の形式で実行するとERRORとなるがバージョン一覧を出力してくれる
$ pip install selenium==
Collecting selenium==
  ERROR: Could not find a version that satisfies the requirement selenium== (from versions: 0.9.2, 1.0.1, 1.0.3, 2.0.dev0, 2.0.dev1, 2.0.dev2, 2.0.dev3, 2.0.dev4, 2.0.dev5, 2.0.dev6, 2.0.dev9138, 2.0.dev9212, 2.0.dev9231, 2.0.dev9284, 2.0.dev9306, 2.0.dev9307, 2.0.dev9310, 2.0.dev9338, 2.0.dev9340, 2.0.dev9341, 2.0.dev9429, 2.0a5, 2.0b2, 2.0b3.dev0, 2.0b3, 2.0b4.dev0, 2.0rc1, 2.0rc2, 2.0rc3, 2.0.0, 2.0.1, 2.1.0, 2.2.0, 2.3.0, 2.4.0, 2.5.0, 2.6.0, 2.7.0, 2.8.0, 2.8.1, 2.9.0, 2.10.0, 2.11.0, 2.11.1, 2.12.0, 2.12.1, 2.13.0, 2.13.1, 2.14.0, 2.15.0, 2.16.0, 2.17.0, 2.18.0, 2.18.1, 2.19.0, 2.19.1, 2.20.0, 2.21.0, 2.21.1, 2.21.2, 2.21.3, 2.22.0, 2.22.1, 2.23.0, 2.24.0, 2.25.0, 2.26.0, 2.27.0, 2.28.0, 2.29.0, 2.30.0, 2.31.0, 2.32.0, 2.33.0, 2.34.0, 2.35.0, 2.36.0, 2.37.0, 2.37.1, 2.37.2, 2.38.0, 2.38.1, 2.38.2, 2.38.3, 2.38.4, 2.39.0, 2.40.0, 2.41.0, 2.42.0, 2.42.1, 2.43.0, 2.44.0, 2.45.0, 2.46.0, 2.46.1, 2.47.0, 2.47.1, 2.47.2, 2.47.3, 2.48.0, 2.49.0, 2.49.1, 2.49.2, 2.50.0, 2.50.1, 2.51.0, 2.51.1, 2.52.0, 2.53.0, 2.53.1, 2.53.2, 2.53.3, 2.53.4, 2.53.5, 2.53.6, 3.0.0b1, 3.0.0b2, 3.0.0b3, 3.0.0, 3.0.1, 3.0.2, 3.3.0, 3.3.1, 3.3.2, 3.3.3, 3.4.0, 3.4.1, 3.4.2, 3.4.3, 3.5.0, 3.6.0, 3.7.0, 3.8.0, 3.8.1, 3.9.0, 3.10.0, 3.11.0, 3.12.0, 3.13.0, 3.14.0, 3.14.1, 3.141.0, 4.0.0a1)
ERROR: No matching distribution found for selenium==

他のやり方としては、PyPIを参考にGUIで検索するのもよいでしょう。

1個前のバージョンをインストールしてみよう!

PyPIにもバージョン指定のインストール方法が記されているのでコピペして実行してみます。
https://pypi.org/project/selenium/3.14.1/

どれどれ。。。

$ pip install selenium==3.14.1
zsh: 3.14.1 not found

なぜかzshさんが出てきた?

ちなみに当方の環境は、Macのzshを使っていました。

こんなのを試してみる

いきなりzshが出てきてびっくりしたので、echoでも試してみました。

$ echo a==1
zsh: 1 not found

でました、zshさん。なるほど、pipは関係なさそうです。

原因

詳しく調査していくと、zsh環境下で hoge==fuga のような形式で記述をすると予約語 (expansion)とぶつかってしまうということでした。
ちなみに、 hoge==fuga は下記のaliasとして機能してしまうようでした(驚き

# fugaなんてないからnot found
$ echo hoge=$(which fuga)
hoge=fuga not found

参考: ZSH Gem #11: Path and filename expansion

さらに、 =hoge の形だと、hogeというコマンドの絶対パスのaliasになるそうです(これも知らなかった!&何かに使えそう!

# echoの絶対パスをechoする
$ echo =echo
/bin/echo

hoge== の形式では、特にexpansionとぶつかることがないようなので、バージョン検索だけは動いたというわけです。

# この形はexpansionには存在しないため、普通にhoge==が出力される
$ echo hoge==
hoge==

解決方法

ここまでお読みいただいた方はうすうす感づいているかも知れませんが、==みたいな記述が必要な時は""(ダブルクオーテーション)や''(シングルクオーテーション)で囲ってやりましょう。

# zsh環境下で=や==を含む場合は''で囲いましょう
$ pip install 'selenium==3.14.1'
Collecting selenium==3.14.1
  Downloading https://files.pythonhosted.org/packages/b0/c9/52390baa8d6b65c3e3b89f522c3a0fcf58f2b4faf37893ef9d97cddde699/selenium-3.14.1-py2.py3-none-any.whl (902kB)
     |████████████████████████████████| 911kB 2.3MB/s
Requirement already satisfied: urllib3 in ./venv/lib/python3.7/site-packages (from selenium==3.14.1) (1.25.3)
Installing collected packages: selenium
  Found existing installation: selenium 3.141.0
    Uninstalling selenium-3.141.0:
      Successfully uninstalled selenium-3.141.0
Successfully installed selenium-3.14.1

これで、実現したかったことができました
(原因が気になってしまい、いろいろ調べてしまったらなかなか面白かったので記事にしましたw
 案外ハマりそうだけどあまり記事がなかったので、お困りの方の助けになれば幸いです