Open6

pipとは

いいづかいいづか

pipとは

Pythonのパッケージインストーラ

pip is the package installer for Python. You can use pip to install packages from the Python Package Index and other indexes.

3ヶ月ごとに新しいバージョンをリリースしているとのこと

https://pypi.org/project/pip/

いいづかいいづか

Getting Started

pipがちゃんとインストールされているかの確認

まず、Pythonがインストールされているか確認します。

python3 --version
=> Python 3.N.N

次に、pipがインストールされているか確認します。

python3 -m pip --version
=> pip X.Y.Z from ... (python 3.N.N)

TODO: コマンド解説

パッケージのインストール

通常のインストール

python3 -m pip install sampleproject

Githubからのインストール

python3 -m pip install git+https://github.com/pypa/sampleproject.git@main

distribution fileからのインストール

python3 -m pip install sampleproject-1.0.tar.gz
python3 -m pip install sampleproject-1.0-py3-none-any.whl

requirementsファイルを使って複数パッケージをインストール

python3 -m pip install -r requirements.txt

パッケージのアップグレード

python3 -m pip install --upgrade sampleproject

パッケージのアンインストール

python3 -m pip uninstall sampleproject
=> Uninstalling sampleproject:
=>   [...]
Proceed (Y/n)? y

https://pip.pypa.io/en/stable/getting-started/

いいづかいいづか

Installation

通常、仮想環境やpython.orgからPythonをダウンロード済みの環境では、
pipはインストールされているみたいです。
(どっかしらのディストリビューターが修正したensurepipを削除したPythonをインストールしてもpipは使えませんとのこと、あんまりないと思うけど)

pipのインストール

pipがインストールされていなかった場合は以下コマンドでインストール
https://pip.pypa.io/en/stable/installation/#supported-methods

pipのzipアプリケーションインストールや、他の方法でのインストール方法についても言及されていますが、割愛。

pipのアップグレード

python3 -m pip install --upgrade pip

Compatibilityについて

TODO: あとで読む
https://pip.pypa.io/en/stable/installation/#compatibility

ちなみにpythonではなくpython3pipではなくpip3コマンドでないと使えませんでした。
これは、pythonのバージョンが2までと3以上でかなり違いがあることが原因のようです。
詳しくはこの記事がわかりやすかったです。
https://tooljp.com/windows/chigai/html/Python/pip_pip3_chigai.html

_
https://pip.pypa.io/en/stable/installation/

いいづかいいづか

User Guide

pipの実行

pipがインストールされていれば、pipコマンドを使うことができます。

python3 -m pip <pip arguments>

python3 -m pipというコマンドを使うと、自身のローカルで定義されているpythonのPythonインタープリタを使って、pipが実行されます。
なので、/usr/bin/python3.7 -m pipを実行するのは、/usr/bin/python3.7に置いてあるインタープリタを使ってpipを実行するということになります。

パッケージのインストール

pipでパッケージをインストールする際は、
PyPI、バージョン管理(?)、ローカルのプロジェクト、ディストリビューションファイルからインストールすることが可能です。

python3 -m pip install SomePackage            # latest version
python3 -m pip install SomePackage==1.0.4     # specific version
python3 -m pip install 'SomePackage>=1.0.4'     # minimum version

一番ポピュラーなやり方は、
Requirement Specifiersを使ってPyPIからインストールする方法です。

Proxy Serverを使う

TODO: あとで読む
https://pip.pypa.io/en/stable/user_guide/#using-a-proxy-server

Requirements Files

"Requirements Files"は、pipで一気にインストールしたいパッケージのリストを書くファイルです。

python3 -m pip install -r requirements.txt

ファイルの書き方

論理的に、Requirements fileは、pip installに渡す引数のリストです。
書いてある順番通りにインストールされるわけじゃないので気をつけてください。

例えば、"http://example.com/requirements.txt"みたいに、
URLを使ってRequirements filesにアクセスすることも可能なので、
ローカルのファイルだったり、共通の場所で管理することもできます。

Requirements Filesには、4つの使い方があります。

  1. pip freezeの結果を書き込む
    繰り返しインストールできるよう、Requirements fileにpip freezeの結果を持たせます。

そうすると、Requirements fileには、pip freeze実行時の全パッケージの固定バージョンの情報が書き込まれます。

python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt

上記は、pip freezeを実行してrequirements.txtに書き込み、
そのrequirements.txtをもとにパッケージをインストールしている例です。

  1. 依存関係を適切に解決する
    Requirements filesは、pipに依存関係を適切に解決させるために使われます。

pipのバージョンが20.2以前のものは、真の依存関係解決の機能はありませんが、プロジェクト内で最初に読み込まれたバージョン指定を適用します。

例えば、pkg1pkg3>=1.0を必要とし、pkg2pkg3>=1.0,<=2.0を必要とする場合、pkg1が先に解決されると、pipはpkg3>=1.0のみを適用し、pkg2バージョン指定と矛盾するバージョンのpkg3をインストールしてしまう可能性があります。

この問題を解決するためには、以下の例のように
矛盾の起きないバージョン指定pkg3>=1.0,<=2.0のみ記載し、他のパッケージにはバージョンを指定しないようにすることで解決できます。

pkg1
pkg2
pkg3>=1.0,<=2.0
  1. バージョン固定
    Requirements filesは、インストールするパッケージのバージョンを指定できます。
    例えば、ProjectAProjectBに依存しているが、ProjectBの最新バージョン(v1.3)にバグがあった場合、小さいバージョンのProjectBをインストールさせることができます。
ProjectA
ProjectB<1.3
  1. ローカル内のパッケージ読み込み
    依存先をローカルのパッチでオーバーライドすることができます。

例えば、PyPIからSomeDependencyパッケージをインストールしているとします。
SomeDependencyパッケージにバグが発見されましたが、修正を待つことができないので、コードをクローンし修正して、sometagのタグをつけたものをgitで管理します。
その場合、Requirements fileでは、以下のように指定することができます。

git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency

元々SomeDependencyを使っていた場合は、上記のように置き換えます。
使っているパッケージの依存先でSomeDependencyがある場合は、上記を追加します。

pipは、requirements.txtファイルの中身によって依存関係を決定するのではなく、install_requires metadataを使って依存関係を決定しているということを忘れないようにしてください。

TODO: 上記を深掘りする