LoginSignup
79
78

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-12-02

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

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の先頭のパスから優先的に読まれます。新たにパスを追加した後にリストを逆転させることで、追加したパスを最優先で読ませることが出来ます。

79
78
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79
78