意外と知らない?pipコマンド


よく使うコマンドから、込み入ったコマンドまでを使用ケース毎に紹介します。

Case 1. 依存関係のケア

パッケージの依存関係で問題が生じて、スクリプトが上手く動作しない...。

(1) 依存関係の問題をチェックしましょう。

$ pip check
# パッケージの依存関係に問題がない場合、
# No broken requirements found.
# と出力されます。

(2) パッケージの要求されているバージョンが確認できたら、利用可能なバージョンを確認します。

$ pip install <package>==
# ERROR: Could not find a version that satisfies the requirement <package>== (...
# とエラーが出力され、利用可能なパッケージのバージョンが確認出来ます。

(3) バージョンを指定してインストール

$ pip install <package>==<version>

# 最新状態にしたい時は
$ pip install -U <package>
# とあるバージョン未満で最新の状態にしたい時は
$ pip install -U "<package> < <version>" # 不等号 < を使ってます。

インストール済みパッケージの依存関係を確認

パッケージの詳細と共に依存関係を確認するにはshowを使います。

$ pip show <package>

pipdeptreeパッケージを使うと、バージョン情報込みの依存関係を表示できます。

$ pip install pipdeptree

# <package>が要求するパッケージとそのバージョンを表示。
$ pipdeptree -p <packgage>
# <package>を要求するパッケージと、要求されるバージョンの表示。
$ pipdeptree -r -p <packgage>

インストールしていないパッケージの詳細&依存関係の確認

次のようにPyPiに聞くとインストールしていないパッケージの詳細も調べることが出来ます。

import requests
from pprint import pprint # 出力整形のためにインポート

package = '<package>'
version = '<version>'
url = f'https://pypi.org/pypi/{package}/{version}/json'
# バージョンを指定しないなら
# url = f'https://pypi.org/pypi/{package}/json'

json = requests.get(url).json()
pprint(json['info'])

指定したパッケージが要求するパッケージは次で確認出来ます。

pprint(json['info']['requires_dist'])

Case 2. オフライン環境でパッケージをインストール

sshで接続した先でpip install <package>したいけど、接続先がオフライン!

(1) 先ずはオンラインで、必要なパッケージを./src直下にダウンロードします(バージョンを指定したい時は<package>==<version>としましょう)。

$ pip download -d ./src <package>
# or
$ pip download -d ./src -r requirements.txt

(2) scp./srcを転送。

$ scp -r -C ./src <user>@<host>:<path>

# 容量が大きい場合は圧縮して送ろう。
$ tar czf src.tar.gz src
$ scp -C ./src.tar.gz <user>@<host>:<path> 

(3) sshで接続後、srcディレクトリの中に入ります。以下のコマンドでインストール完了です!

$ pip install <package (file name)> # カレントディレクトリから1つずつインストール。
# or 
$ pip install ./* # まとめてインストール。

# srcを圧縮した場合は、事前に解凍しましょう。
$ tar xzf src.tar.gz

pip downloadのあれこれ

ソースパッケージをダウンロード。

$ pip download -d ./src --no-binary :all: <package>

バージョンやプラットフォームを指定してバイナリパッケージをダウンロード。

$ pip download -d ./src --only-binary :all: --platform <platform> --python-version <python_version> --implementation <implementation> --abi <abi> <package>

以下、参考ページです。

Case 3. pip installの保存先を変える

とあるパッケージを試しに使ってみたいけど、グローバル、ローカルのpipを汚したくない。仮想環境を使う程ではないしな...。

(1) ディレクトリを指定してパッケージをインストール。

$ pip install -t <dir> <package>

(2) スクリプトに以下の行を加えることで、<dir>直下のパッケージが使用可能になります。

import sys
sys.path.append(dirpath)

# パスの指定方法その1
import os
dirpath = sys.path.append(os.path.join(os.path.dirname(__file__), '<dir>の相対パス'))
# パスの指定方法その2
from pathlib import Path
dirpath = sys.path.append(str((Path(__file__).parent/'<dir>の相対パス').resolve()))
# パスの指定方法その3
dirpath = '<dir>の絶対パス'

dirpathに相対パスを書いても実行出来ますが、書いたスクリプトを他のスクリプトから呼び出す場合、__file__を用いるか、絶対パスでdirpathを指定する必要があります。

(3) パッケージが要らなくなったらディレクトリを消去。

$ rm -r <dir>

インストール済みパッケージの違うバージョンを試したい

パッケージをインストールしたディレクトリ<dir>内でスクリプトを実行すれば、<dir>内のパッケージが優先してインポートされます。

もし、<dir>の外でスクリプトを実行し、かつ既にグローバルorローカルにインストールしてあるパッケージの別バージョンが使いたい時は、次の一行を加えましょう。

sys.path = sys.path[::-1]

パッケージはsys.pathの先頭のパスから優先的に読まれます。新たにパスを追加した後にリストを逆転させることで、追加したパスを最優先で読ませることが出来ます。