pipとはなにか、何ができるか整理してみた【ゼロからPython勉強してみる】

# はじめに
[前回](https://qiita.com/_starfields_/items/c8071c00906f77b09acb)は「コマンドプロンプトとpowershellの違いを整理するように。」と宿題を頂き、自分なりに整理した記事を投稿しましたが、今回は「pipについて整理するように。」と宿題を頂きましたので勉強してみた内容を整理してみます。

現在牛歩で進んでいる、ゼロから独学でPythonを勉強してみるシリーズの一環ですので超初心者が書いている備忘録であることをご理解下さい。

# pip(ピップ）とは

[pip](https://pip.pypa.io/en/stable/)とはPythonで開発されたパッケージを管理するパッケージマネージャです。
（pipの公式ページではパッケージインストーラーと書かれていますが、アンインストールやバージョンのチェックとかもできまるのでパッケージマネージャの方がしっくりくるかも。）
**Pip Installs Packages**または**Pip Installs Python**の略だと言われているようです。
pip自身もPythonのモジュールの一つと考えていいと思います。

>pip is the package installer for Python. You can use it to install packages from the Python Package Index and other indexes.
>引用　公式ページ:https://pip.pypa.io/en/stable/

[pip](https://pip.pypa.io/en/stable/)は[Python公式のドキュメント](https://docs.python.org/ja/3/whatsnew/3.4.html#bootstrapping-pip-by-default)によるとPython公式で推奨される標準的なパッケージマネージャであり、Python3においてはPython3.4以降ではPythonのインストール時に標準で一緒にpipもインストールされるようになっているようです。
そのおかげで私も特にpipのインストールを行わずpipの機能を使用できていました。

# 何ができるか
pipでできることは大まかに整理すると
* ライブラリのインストール
* ライブラリのアンインストール
* ライブラリのアップデート
* インストールされているライブラリの確認

などがあり、以下に書いてあるコマンドにオプションを使用することで様々なことができます。


https://pip.pypa.io/en/stable/cli/

参考


https://prograshi.com/language/python/python-pip/

https://qiita.com/_whitecat_22/items/3df18491c5f618c016d1#1-pip

また、コマンドは`pip help`で一覧を確認できるほか、`pip help コマンド`、`pip コマンド --help`、`pip コマンド -h`のどれでもで各コマンドのより詳しい説明を確認することができます。

```
> pip help

Usage:
  pip <command> [options]

Commands:
  install                     Install packages.
  download                    Download packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  check                       Verify installed packages have compatible dependencies.
  config                      Manage local and global configuration.
  search                      Search PyPI for packages.
  cache                       Inspect and manage pip's wheel cache.
  index                       Inspect information available from package indexes.
  wheel                       Build wheels from your requirements.
  hash                        Compute hashes of package archives.
  completion                  A helper command used for command completion.
  debug                       Show information useful for debugging.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --debug                     Let unhandled exceptions propagate outside the main subroutine, instead of logging them to stderr.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  --require-virtualenv        Allow pip to only run in a virtual environment; exit with an error otherwise.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --no-input                  Disable prompting for input.
  --proxy <proxy>             Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.
  --trusted-host <hostname>   Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.
  --cert <path>               Path to PEM-encoded CA certificate bundle. If provided, overrides the default. See 'SSL Certificate Verification' in pip documentation for more information.
  --client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.
  --no-color                  Suppress colored output.
  --no-python-version-warning
                              Silence deprecation warnings for upcoming unsupported Pythons.
  --use-feature <feature>     Enable new functionality, that may be backward incompatible.
  --use-deprecated <feature>  Enable deprecated functionality, that will be removed in the future.
```
```
> pip help install

Usage:
  pip install [options] <requirement specifier> [package-index-options] ...
  pip install [options] -r <requirements file> [package-index-options] ...
  pip install [options] [-e] <vcs project url> ...
  pip install [options] [-e] <local project path> ...
  pip install [options] <archive url/path> ...

Description:
  Install packages from:

  - PyPI (and other indexes) using requirement specifiers.
  - VCS project urls.
  - Local project directories.
  - Local or remote source archives.

  pip also supports installing from "requirements files", which provide
  an easy way to specify a whole environment to be installed.

Install Options:
  -r, --requirement <file>    Install from the given requirements file. This option can be used multiple times.
  -c, --constraint <file>     Constrain versions using the given constraints file. This option can be used multiple times.
  --no-deps                   Don't install package dependencies.
  --pre                       Include pre-release and development versions. By default, pip only finds stable versions.
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.
  -t, --target <dir>          Install packages into <dir>. By default this will not replace existing files/folders in <dir>. Use --upgrade to replace existing packages in <dir> with new versions.
  --platform <platform>       Only use wheels compatible with <platform>. Defaults to the platform of the running system. Use this option multiple times to specify multiple platforms supported by the target interpreter.
  --python-version <python_version>
                              The Python interpreter version to use for wheel and "Requires-Python" compatibility checks. Defaults to a version derived from the running interpreter. The version can be specified using up to      
                              three dot-separated integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor version can also be given as a string without dots (e.g. "37" for 3.7.0).
  --implementation <implementation>
                              Only use wheels compatible with Python implementation <implementation>, e.g. 'pp', 'jy', 'cp',  or 'ip'. If not specified, then the current interpreter implementation is used.  Use 'py' to force    
                              implementation-agnostic wheels.
  --abi <abi>                 Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not specified, then the current interpreter abi tag is used. Use this option multiple times to specify multiple abis supported   
                              by the target interpreter. Generally you will need to specify --implementation, --platform, and --python-version when using this option.
  --user                      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on Windows. (See the Python documentation for site.USER_BASE for full details.)
  --root <dir>                Install everything relative to this alternate root directory.
  --prefix <dir>              Installation prefix where lib, bin and other top-level folders are placed
  --src <dir>                 Directory to check out editable projects into. The default in a virtualenv is "<venv path>/src". The default for global installs is "<current dir>/src".
  -U, --upgrade               Upgrade all specified packages to the newest available version. The handling of dependencies depends on the upgrade-strategy used.
  --upgrade-strategy <upgrade_strategy>
                              Determines how dependency upgrading should be handled [default: only-if-needed]. "eager" - dependencies are upgraded regardless of whether the currently installed version satisfies the
                              requirements of the upgraded package(s). "only-if-needed" -  are upgraded only when they do not satisfy the requirements of the upgraded package(s).
  --force-reinstall           Reinstall all packages even if they are already up-to-date.
  -I, --ignore-installed      Ignore the installed packages, overwriting them. This can break your system if the existing package is of a different version or was installed with a different package manager!
  --ignore-requires-python    Ignore the Requires-Python information.
  --no-build-isolation        Disable isolation when building a modern source distribution. Build dependencies specified by PEP 518 must be already installed if this option is used.
  --use-pep517                Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy behaviour).
  --config-settings <settings>
                              Configuration settings to be passed to the PEP 517 build backend. Settings take the form KEY=VALUE. Use multiple --config-settings options to pass multiple keys to the backend.
  --install-option <options>  Extra arguments to be supplied to the setup.py install command (use like --install-option="--install-scripts=/usr/local/bin"). Use multiple --install-option options to pass multiple options to      
                              setup.py install. If you are using an option with a directory path, be sure to use absolute path.
  --global-option <options>   Extra global options to be supplied to the setup.py call before the install or bdist_wheel command.
  --compile                   Compile Python source files to bytecode
  --no-compile                Do not compile Python source files to bytecode
  --no-warn-script-location   Do not warn when installing scripts outside PATH
  --no-warn-conflicts         Do not warn about broken dependencies
  --no-binary <format_control>
                              Do not use binary packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all binary packages, ":none:" to empty the set (notice the    
                              colons), or one or more package names with commas between them (no colons). Note that some packages are tricky to compile and may fail to install when this option is used on them.
  --only-binary <format_control>
                              Do not use source packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all source packages, ":none:" to empty the set, or one or     
                              more package names with commas between them. Packages without binary distributions will fail to install when this option is used on them.
  --prefer-binary             Prefer older binary packages over newer source packages.
  --require-hashes            Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a requirements file has a --hash option.
  --progress-bar <progress_bar>
                              Specify whether the progress bar should be used [on, off] (default: on)
  --root-user-action <root_user_action>
                              Action if pip is run as a root user. By default, a warning message is shown.
  --no-clean                  Don't clean up build directories.

Package Index Options:
  -i, --index-url <url>       Base URL of the Python Package Index (default https://pypi.org/simple). This should point to a repository compliant with PEP 503 (the simple repository API) or a local directory laid out in the     
                              same format.
  --extra-index-url <url>     Extra URLs of package indexes to use in addition to --index-url. Should follow the same rules as --index-url.
  --no-index                  Ignore package index (only looking at --find-links URLs instead).
  -f, --find-links <url>      If a URL or path to an html file, then parse for links to archives such as sdist (.tar.gz) or wheel (.whl) files. If a local path or file:// URL that's a directory, then look for archives in the    
                              directory listing. Links to VCS project URLs are not supported.

General Options:
  -h, --help                  Show help.
  --debug                     Let unhandled exceptions propagate outside the main subroutine, instead of logging them to stderr.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  --require-virtualenv        Allow pip to only run in a virtual environment; exit with an error otherwise.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels).
  --log <path>                Path to a verbose appending log.
  --no-input                  Disable prompting for input.
  --proxy <proxy>             Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.
  --trusted-host <hostname>   Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.
  --cert <path>               Path to PEM-encoded CA certificate bundle. If provided, overrides the default. See 'SSL Certificate Verification' in pip documentation for more information.
  --client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
                              Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.
  --no-color                  Suppress colored output.
  --no-python-version-warning
                              Silence deprecation warnings for upcoming unsupported Pythons.
  --use-feature <feature>     Enable new functionality, that may be backward incompatible.
  --use-deprecated <feature>  Enable deprecated functionality, that will be removed in the future.
```

## install　ライブラリのインストール  
Pythonはインストールした際にすでに組み込まれているライブラリがあり、それらを[標準ライブラリ](https://docs.python.org/ja/3/library/index.html)といいます。
それ以外の後からPythonに各自が追加するライブラリを外部ライブラリといい、それらの多くは[PyPI](https://pypi.org)（Python Package Index)というPython用ソフトウェアのリポジトリに登録されており、容易に検索可能であるほか、pipを用いてインターネット経由でインストールすることが可能のようです。

外部ライブラリの入手先としてPyPIを挙げましたが、pipはPyPI以外のリポジトリやローカルのファイルからもライブラリのインストールを行えるとのことです。

>Install packages from:
>
>* PyPI (and other indexes) using requirement specifiers.
>* VCS project urls.
>* Local project directories.
>* Local or remote source archives.
>
>pip also supports installing from “requirements files”, which provide an easy way to specify a whole environment to be installed.
>引用：https://pip.pypa.io/en/stable/cli/pip_install/

### 標準のインストール
特にライブラリのバージョンやインストールするディレクトリを設定せず、PyPIに登録されているライブラリをインストールする場合は、以下のコマンドをコンソールに入力し実行することで最新版のライブラリをインストールできます。

```markdown
pip install ライブラリ 
```

### オプション、引数
pipを用いてライブラリをインストールする際は各種オプションを用いることにより様々なインストール方法を指定できます。
コマンドは以下の形式で記載します。（[ ]の内容は省略可能です。）

```
pip install [オプション] <ライブラリ名> [バージョン指定子] [パッケージインデックスオプション]
pip install [オプション] -r <requirementsファイル> [パッケージインデックスオプション]
pip install [オプション] [-e] <VSCプロジェクトのURL>
pip install [オプション] [-e] <ローカルプロジェクトのURL>
pip install [オプション] <アーカイブのURLまたはパス>
```
オプションには`install`コマンド以外でも使える`General Options`と`install`コマンド用の`Install Options`があるようです。
非常に種類が多いので、helpコマンドで表示されるオプションと説明の一覧は下に記しますが、整理するのは一部にとどめます。

<details><summary>General Options</summary>

|オプション| 説明|
|:---------------------|:----------------|
|-h, --help|Show help.<br>ヘルプを表示する。 |
|--debug|Let unhandled exceptions propagate outside the main subroutine, instead of logging them to stderr.| 
|--isolated|Run pip in an isolated mode, ignoring environment variables and user configuration.|
|--require-virtualenv|Allow pip to only run in a virtual environment; exit with an error otherwise.| 
|-v, --verbose|Give more output. Option is additive, and can be used up to 3 times.|
|-V, --version|Show version and exit.| 
|-q, --quiet|Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels).|
|--log <path>|Path to a verbose appending log.| 
|--no-input|Disable prompting for input.|
|--proxy <proxy>|Specify a proxy in the form [user:passwd@]proxy.server:port.| 
|--retries <retries>|Maximum number of retries each connection should attempt (default 5 times).|
|--timeout <sec>|Set the socket timeout (default 15 seconds).| 
| --exists-action <action>|Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.|
|--trusted-host <hostname>|Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.| 
|--cert <path>|Path to PEM-encoded CA certificate bundle. If provided, overrides the default. See 'SSL Certificate Verification' in pip documentation for more information.|
|--client-cert <path>|Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.| 
|--cache-dir <dir>|Store the cache data in <dir>.|
|--no-cache-dir|Disable the cache.| 
|--disable-pip-version-check|Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.|
|--no-color|Suppress colored output.| 
|--no-python-version-warning|Silence deprecation warnings for upcoming unsupported Pythons.|
|--use-feature <feature>|Enable new functionality, that may be backward incompatible.| 
|--use-deprecated <feature>|Enable deprecated functionality, that will be removed in the future.|

</details>

<details><summary>Install Options</summary>

|オプション|説明|
|:--------|:-------|
|-r, --requirement <file>|Install from the given requirements file. This option can be used multiple times.<br>指定された要件ファイルの記述を参照してインストールする。|
|-c, --constraint <file>|Constrain versions using the given constraints file. This option can be used multiple times.<br>指定された制約ファイルの記述を参照してバージョンを管理する。|
|--no-deps|Don't install package dependencies.<br>依存関係にある他のライブラリをインストールしない（-U,-upgradeと併用すると指定したライブラリのみアップグレードしてくれる）|
|--pre|Include pre-release and development versions. By default, pip only finds stable versions.<br>インストール対象のバージョンにプレリリースバージョンと開発バージョンを含める。デフォルト(--preオプションを使用しなければ)ではインストール対象は安定したバージョンのみとなる。|
|-e, --editable <path/url>|Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.|
|-t, --target <dir>|Install packages into <dir>. By default this will not replace existing files/folders in <dir>. Use --upgrade to replace existing packages in <dir> with new versions.<br>ライブラリを任意のディレクトリにインストールする。デフォルトで任意のディレクトリに存在するファイルの上書きは行われないが、`--upgrage`オプションを使用して新しいバージョンに置き換えることができる。|
|--platform <platform>|Only use wheels compatible with <platform>. Defaults to the platform of the running system. Use this option multiple times to specify multiple platforms supported by the target interpreter.|
|--python-version <python_version>|The Python interpreter version to use for wheel and "Requires-Python" compatibility checks. Defaults to a version derived from the running interpreter. The version can be specified using up to three dot-separated integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor version can also be given as a string without dots (e.g. "37" for 3.7.0).|
|--implementation <implementation>|Only use wheels compatible with Python implementation <implementation>, e.g. 'pp', 'jy', 'cp',  or 'ip'. If not specified, then the current interpreter implementation is used. Use 'py' to force implementation-agnostic wheels.|
|--abi <abi>|Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not specified, then the current interpreter abi tag is used. Use this option multiple times to specify multiple abis supported by the target interpreter. Generally you will need to specify --implementation, --platform, and --python-version when using this option.|
|--user|Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on Windows. (See the Python documentation for site.USER_BASE for full details.)|
|--root <dir>|Install everything relative to this alternate root directory.|
|--prefix <dir>|Installation prefix where lib, bin and other top-level folders are placed.|
|--src <dir>|Directory to check out editable projects into. The default in a virtualenv is "<venv path>/src". The default for global installs is "<current dir>/src".|
|-U, --upgrade|Upgrade all specified packages to the newest available version. The handling of dependencies depends on the upgrade-strategy used.<br>指定されたパッケージ（ライブラリ）を利用可能な最新バージョンにアップグレードする。|
|--upgrade-strategy <upgrade_strategy>|Determines how dependency upgrading should be handled [default: only-if-needed]. "eager" - dependencies are upgraded regardless of whether the currently installed version satisfies the requirements of the upgraded package(s). "only-if-needed" -  are upgraded only when they do not satisfy the requirements of the upgraded package(s).<br>ライブラリをアップグレードする際に、依存関係にあるパッケージもアップグレードするかを選択できる。<br>`eager`を選択した場合、動作要件の適否にかかわらず依存関係にあるパッケージすべてをアップグレードする。<br>`only-if-needed`を選択した場合、動作要件を満たさない場合にのみ動作要件を満たすように依存関係にあるパッケージをアップグレードする。（デフォルトでは`only-if-needed`に設定されている)|
|--force-reinstall|Reinstall all packages even if they are already up-to-date.<現在のバージョンが最新であるか否かに関わらず、パッケージを再インストールする>|
|-I, --ignore-installed|Ignore the installed packages, overwriting them. This can break your system if the existing package is of a different version or was installed with a different package manager!|
|--ignore-requires-python|Ignore the Requires-Python information.|
|--no-build-isolation|Disable isolation when building a modern source distribution. Build dependencies specified by PEP 518 must be already installed if this option is used.|
|--use-pep517|Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy behaviour).|
|--install-option <options>|Extra arguments to be supplied to the setup.py install command (use like --install-option="--install-scripts=/usr/local/bin"). Use multiple --install-option options to pass multiple options to setup.py install. If you are using an option with a directory path, be sure to use absolute path.|
|--global-option <options>|Extra global options to be supplied to the setup.py call before the install or bdist_wheel command.|
|--compile|Compile Python source files to bytecode|
|--no-compile|Do not compile Python source files to bytecode|
|--no-warn-script-location|Do not warn when installing scripts outside PATH|
|--no-warn-conflicts|Do not warn about broken dependencies|
|--no-binary <format_control>|Do not use binary packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all binary packages, ":none:" to empty the set (notice the colons), or one or more package names with commas between them (no colons). Note that some packages are tricky to compile and may fail to install when this option is used on them.|
|--only-binary <format_control>|Do not use source packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all source packages, ":none:" to empty the set, or one or more package names with commas between them. Packages without binary distributions will fail to install when this option is used on them.|
|--prefer-binary|Prefer older binary packages over newer source packages.|
|--require-hashes|Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a requirements file has a --hash option.|
|--progress-bar <progress_bar>|Specify type of progress to be displayed [off|on|ascii|pretty|emoji] (default: on)|
|--no-clean|Don't clean up build directories.|

</details>


パッケージインデックスオプションでは、pipを用いてライブラリをインストールする際に見に行くURL(デフォルトでは https://pypi.org/simple ）の指定等が行えるようですが、ここに関してはまだ理解ができていないのと当面PyPI以外からパッケージをインストールする予定もないので、今後必要になったら再度整理します。

#### ライブラリのバージョンを指定してインストールする
インストールの際にはバージョン指定子（Version specifiers）を使ってライブラリのバージョンを指定することができます。

参考

https://pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiers

https://peps.python.org/pep-0440/#version-specifiers

バージョン指定子には`==`、`~=`、`>=`、`<=`、`>`、`<`などがあります。
これらは`,`を使ってANDで条件を組み合わせることも可能です。(例：`hoge>=1.0,<=3.3` はバージョン1.0以上3.3以下のhogeを指定している)

* Version matching :一致するバージョンを指定
`==バージョン`で指定、指定されたバージョンと一致したバージョンをインストールする。
`*`でワイルドカード表現を使うことも可能。ワイルドカードを使用しないでの`==`の使用は推奨されていないもよう。

```:例
pip install hoge==1.1.0
#hogeのバージョン1.1.0をインストール

pip install hoge==1.1.*
# hogeのバージョン1.1の中で最新のものをインストールする。
# hogeのバージョンに1.0.0、1.1.0、1.1.1、1.2.0があった場合インストールされるのは1.1.1
```
:::note
* 存在しないバージョンを指定するとエラー文とともにインストールできるバージョンの一覧が表示される。
* `==1.22`のようにパッチバージョンを無視して指定した場合0が補足されて`==1.22.0`が指定されるようです。
![pipとは_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d20eea0d-ff60-b326-4739-f2e182a4866a.png)
:::

* Version exclusion:特定バージョンの除外
`!=バージョン`で指定したバージョンをインストールする候補から除外する。

* Inclusive ordered comparison:特定バージョン以上(または以下)を指定
`>=バージョン`で特定バージョン以上、`<=バージョン`で特定バージョン以下を指定できる、その範囲内で最新のものがインストールされる。

* Exclusive ordered comparison:特定バージョンより大きい（または未満)を指定
`>バージョン`で特定バージョンより大きいバージョン、`<=バージョン`で特定バージョンより小さいバージョンを指定できる、その範囲内で最新のものがインストールされる。


* Compatible release：互換性のあるものから指定
`~= バージョン`で指定、互換性があるものの中で最新のバージョンをインストールする。

例としてインストールしたいhogeというライブラリに`0.1.0`、`0.2.0`、`0.2.1`、`0.2.2`、`0.3.0`というバージョンがあった時、以下のコマンドを実行すると`0.2.2`がインストールされる。

```
pip install hoge~=0.2.0
```
なお、上記のコマンドと以下のコマンドは同義となる。

```
pip install hoge>=0.2.0,==0.2.* 
```
* Arbitrary equality:任意の文字列に対する一致？
`===バージョン`でもインストールしたいバージョンを指定できるようでしたが、このバージョン指定子は解説を読んでもいまいち理解ができませんでした。
標準のバージョンを表すフォーマット`[N!]N(.N)*[{a|b|rc}N][.postN][.devN]`以外のフォーマットで管理されているライブラリのバージョンを指定できる指定子のようですが、使用は非推奨とのことなのでこの程度の認識で終わらせておきます。例えば、hogeというライブラリに`foobar`というバージョンがあった場合`pip install hoge===foobar`で`foobar`というバージョンのhogeをインストールできるらしい。

>The canonical public version identifiers MUST comply with the following scheme:
>`[N!]N(.N)*[{a|b|rc}N][.postN][.devN]`
>Public version identifiers are separated into up to five segments:
>* Epoch segment: `N!`
>* Release segment: `N(.N)*`
>* Pre-release segment: `{a|b|rc}N`
>* Post-release segment: `.postN`
>* Development release segment: `.devN`
>
>引用:https://peps.python.org/pep-0440/#public-version-identifiers



#### environment markersを用いてインストールの条件を指定する

使用するPythonのバージョンやOSによってインストールするかしないかを設定できるらしい。
条件を指定するには先ほどのバージョン指定子のようにライブラリ名の後ろに記述を追加する。
以下に示す`sys_platform`等がenvironment markerというらしい。

```:例
#OSがWindows32bitならhogeをインストールする
pip install hoge;sys_platform == win32

#OSがWindows32bitならhogeをインストールしない
pip install hoge;sys_platform!=win32

#Pythonのバージョンが3.9以下ならhogeをインストールする
pip install hoge;python_version<'3.9'

```

参考

https://peps.python.org/pep-0508/#environment-markers

#### 複数のライブラリを一括でインストールする
ライブラリ名やバージョンを記載したテキストファイルである要件ファイル(requirementsファイル）を使用することで、複数のライブラリを指定したバージョンでまとめてインストールすることが可能です。
この方法は使用している環境のライブラリ構成を要件ファイルとして出力し、他の環境で同様のライブラリ構成を構築したい際などに使用します。
要件ファイルは一般的に`requirements.txt`という名前で作成するようですが、ファイルの名前は任意のもので構いません。
以下のどちらかのコマンドで要件ファイルに記載されたパッケージをインストールします。

```
-r 要件ファイルのパス
--requirement 要件ファイルのパス
```

要件ファイルのフォーマットについては以下に示す例のように、各行にライブラリの名前とそのライブラリインストール時のオプション等を記載する形です。(hogeはインストールしたいライブラリ名）
`install`コマンドでインストールする際の`install`以下の引数等の部分を各行に記載するという認識で問題ないと思います。
また、指定した要件ファイル内で他の要件ファイルを指定することでそれに記載されたライブラリのインストールも可能です。

```markdown:requirements.txt

##Pythonのコード同様に#以下はコメントとなる。

##バージョン指定なしでライブラリ名のみで最新版をインストール
hoge

##バージョン指定をしてインストール
hoge~=3.5.0
hoge==1.22.3
hoge>=1.2.0,==1.2.*

##環境の条件を指定してインストール

###Pythonのバージョンが3.8より小さければhogeのバージョン1.2.0をインストール
hoge==1.2.0;python_version<'3.8' 

###使用環境がWindowsの32bitの場合hogeをインストール
hoge; sys_platform == 'win32'

##他の要件ファイルを参照してインストール(ファイル名は任意)
-r piyo.txt
--requirement piyopiyo.txt

##ローカル、インターネット上のファイルを使用してインストール
###ファイルのディレクトリまたはURLを記載
C:\Users\user\Downloads\hoge.whl
http://piyo/hoge.whl
```

要件ファイルの詳しい解説や使用できるオプションについては以下を参照

https://pip.pypa.io/en/stable/reference/requirements-file-format/#requirements-file-format

#### ライブラリのアップグレード
すでにインストールしているライブラリについて、`-U`または`--upgrade`のオプションを使用することで最新のバージョンにアップグレードすることができます。
また、`--upgrade-strategy <アップグレード方法>`ライブラリをアップグレードする際に、依存関係にある他のライブラリを必要の有無に応じてアップグレードすることもできます。


|オプション|説明|
|:-|:-|
|-U, --upgrade|Upgrade all specified packages to the newest available version. The handling of dependencies depends on the upgrade-strategy used.<br>指定されたパッケージ（ライブラリ）を利用可能な最新バージョンにアップグレードする。|
|--upgrade-strategy <upgrade_strategy>|Determines how dependency upgrading should be handled [default: only-if-needed]. "eager" - dependencies are upgraded regardless of whether the currently installed version satisfies the requirements of the upgraded package(s). "only-if-needed" -  are upgraded only when they do not satisfy the requirements of the upgraded package(s).<br>ライブラリをアップグレードする際に、依存関係にあるパッケージもアップグレードするかを選択できる。<br>`eager`を選択した場合、動作要件の適否にかかわらず依存関係にあるパッケージすべてをアップグレードする。<br>`only-if-needed`を選択した場合、動作要件を満たさない場合にのみ動作要件を満たすように依存関係にあるパッケージをアップグレードする。（デフォルトでは`only-if-needed`に設定されている)|

```:例
#hogeに加えhogeと依存関係にあるもののうちアップグレードが必要なもののみアップグレードする。
pip install -U hoge
pip install -U --upgrade-strategy only-if-needed hoge

#hogeに加えhogeと依存関係にあるものすべてアップグレードする。
pip install -U --upgrade-strategy eager hoge

```

:::note
古いライブラリがインストールされている状態で`pip install hoge`を試すと、既に古いバージョンがインストールされていると言われて最新バージョンのインストールはできなかったが、`pip install hoge==バージョン`で最新バージョンを指定してみたところ古いバージョンはアンインストールされ指定したバージョンを無事インストールできた。
この方法でアップグレードすることも可能のようですが、依存関係にあるものがどうなるかは未検証。
黙ってオプションを使った方が早いかもしれない。
![pipとは_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/e2efa6d3-cc66-bb8d-61da-778355dc8e3c.png)
:::

## uninstall　ライブラリのアンインストール
先ほどまではインストールの方法で今度はアンインストールについて。

### 標準的なアンインストール
オプションを設定しないでただ指定したライブラリをアンインストールしたい場合は以下のコマンドで実行できる。

```
pip uninstall ライブラリ名
```
![pipとは_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/cfc89547-2358-258b-9d76-1f50833de6ff.png)

### オプション
`uninstall`コマンドでは先述した`General Options`に加えて`Uninstall Options`が使用できます。

<details><summary>Install Options</summary>

|オプション|説明|
|:--------|:-----|
|-r, --requirement <file>|Uninstall all the packages listed in the given requirements file.  This option can be used multiple times.<br>要件ファイルに記載されたライブラリすべてをアンインストールできる。|
|-y, --yes|Don't ask for confirmation of uninstall deletions.<br>アンインストール時の確認をなくせる。|

</details>

オプションを指定する際のコマンドの記述は以下の通り

```
pip uninstall [オプション] ライブラリ名
pip uninstall [オプション] -r 要件ファイルのパス
```

#### 要件ファイルを用いて一括アンインストール
`-r`または`--requirement`コマンドにより要件ファイルを読み込んで、`install`コマンドの時と同様に複数のライブラリをまとめてアンインストールすることが可能です。

```:

#要件ファイルがカレントディレクトリにあればファイル名のみでよい
#大量のライブラリをアンインストールする際はライブラリ毎に実行の確認をされて面倒
pip uninstall -r 要件ファイルのパス
pip uninstall --requirement 要件ファイルのパス

#なので`-y`または`--yes`オプションを併用することをおすすめします
pip uninstall -y -r 要件ファイルのパス
pip uninstall --yes --requirement 要件ファイルのパス

```

### 依存関係にあるライブラリのアンインストール
pipを使ったインストールやアップグレードではライブラリを一つインストールするだけで依存関係にあるライブラリも一緒にインストールしてくれたりアップグレードしてくれてとても便利です。
ただし、pipの標準機能でのアンインストール時には依存関係にあるライブラリのアンインストールまではやってくれません。

ですが、以下の記事によると`pip-autoremove`というライブラリをインストールすれば依存関係にあるパッケージを丸ごとアンインストールしてくれるとのことです。

https://e-tec-memo.herokuapp.com/article/294/

#### インストールしても動かなかった場合
私の環境（OS:Windows、pip-autoremoveはver.0.10.0）ではどうも素直に対応しませんでした。
`pip install pip-autoremove`でインストールして`pip-autoremove ライブラリ名`でアンインストールをしてくれるとのことなのですが、インストールして実行してみても以下のようなエラーが表示されます。

```
Traceback (most recent call last):
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_maindule_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\WorkSpace\Python\venv\piptest\Scripts\pip-autoremove.exe\__main__.py", line 4, in <module>
ModuleNotFoundError: No module named `pip_autoremove`
```
詳しくはわかりませんが'pip_autoremove'ってモジュールがないと文句を言っているようです。
同様の症状を探してみたら以下のページで解決方法を見つけました。どうやらWindows特有の症状みたいでした。

https://github.com/invl/pip-autoremove/issues/32

https://github.com/invl/pip-autoremove/pull/44

解決方法としては、pipでpip-autoremoveをインストールする際に`pip_autoremove.py`というモジュールがPythonのインストールフォルダまたは仮想環境のフォルダの`\Scripts`に追加されるのですが、このモジュールを`\Lib\site-packages`に移動して、コマンドも`python -m pip_autoremove ライブラリ名`("-"ではなく"_"であることに注意)で実行すれば動くとのこと。

![pipとは_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/2be3b5fe-fcd0-0888-baec-0d0266c35922.png)

:::note
コマンドについては`pip_autoremove.py`がちゃんと`\Lib\site-packages`に入っていて`\Scripts`にPATHが通っていれば`pip-autoremove ライブラリ名`でも動作することを確認した。なので以下のどっちでもよい。
```markdown
##モジュールがpip_autoremove.pyなので"_"であることに注意
python -m pip_autoremove ライブラリ名

##pip-autoremove.exeを呼び出すときは"-"であることに注意
pip-autoremove ライブラリ名
```
![pipとは_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/83587d07-8aea-02c6-0682-2a2b2ed4f2a9.png)
:::



<details><summary>余談</summary>


無事pip-autoremoveは動くようになり、大体問題なく使えたのですが試しに依存関係のパッケージが多いJupyterをインストールしてみてpip-autoremoveで依存関係ごとアンインストールを試みたところ以下のようなエラーが発生しました。
`PermissionError: [WinError 5] アクセスが拒否されました。`とありますが、管理者権限で実行していました。
同じような症状が出ているひともいましたが、私が見たときはこのスレッドでは解決策は出ていませんでした。(https://github.com/invl/pip-autoremove/issues/48)




```terminal
(piptest) PS C:\WorkSpace\Python\Practice> python -m pip_autoremove jupyter 

#～省略～

Uninstall (y/N)? y

#～省略～

Found existing installation: pywin32 304
  Successfully uninstalled pywin32-304　
ERROR: Exception:
Traceback (most recent call last):
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\cli\base_command.py", line 167, in exc_logging_wrapper
    status = run_func(*args)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\commands\uninstall.py", line 102, in run
    uninstall_pathset.commit()
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\req\req_uninstall.py", line 420, in commit
    self._moved_paths.commit()
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\req\req_uninstall.py", line 273, in commit
    save_dir.cleanup()
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\utils\temp_dir.py", line 173, in cleanup
    rmtree(self._path)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\tenacity\__init__.py", line 326, in wrapped_f
    return self(f, *args, **kw)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\tenacity\__init__.py", line 406, in __call__
    do = self.iter(retry_state=retry_state)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\tenacity\__init__.py", line 362, in iter
    raise retry_exc.reraise()
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\tenacity\__init__.py", line 195, in reraise
    raise self.last_attempt.result()
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\_base.py", line 439, in result
    return self.__get_result()
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\_base.py", line 391, in __get_result
    raise self._exception
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\tenacity\__init__.py", line 409, in __call__
    result = fn(*args, **kwargs)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_internal\utils\misc.py", line 124, in rmtree
    shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler)
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 747, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 617, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\shutil.py", line 615, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 5] アクセスが拒否されました。: 'C:\\WorkSpace\\Python\\venv\\piptest\\Lib\\site-packages\\~1win32_system32\\pythoncom310.dll'
Traceback (most recent call last):
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip_autoremove.py", line 214, in <module>
    main()
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip_autoremove.py", line 158, in main
    autoremove(args, yes=opts.yes)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip_autoremove.py", line 45, in autoremove
    remove_dists(dead)
  File "C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip_autoremove.py", line 121, in remove_dists
    subprocess.check_call(pip_cmd + ["uninstall", "-y"] + [d.project_name for d in dists])
  File "C:\Users\ユーザー名\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 369, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['C:\\WorkSpace\\Python\\venv\\piptest\\Scripts\\python.exe', '-m', 'pip', 'uninstall', '-y', 'jupyter-core', 'traitlets', 'nbclient', 'webencodings', 'jupyterlab-widgets', 'bleach', 'Jinja2', 'decorator', 'nbformat', 'terminado', 'argon2-cffi-bindings', 'jsonschema', 'stack-data', 'fastjsonschema', 'nbconvert', 'pycparser', 'jupyter-console', 'ipython-genutils', 'six', 'python-dateutil', 'jedi', 'jupyterlab-pygments', 'parso', 'cffi', 'colorama', 'backcall', 'MarkupSafe', 'ipython', 'pickleshare', 'pywin32', 'jupyter', 'notebook', 'prometheus-client', 'mistune', 'jupyter-client', 'ipywidgets', 'widgetsnbextension', 'Send2Trash', 'tornado', 'nest-asyncio', 'pure-eval', 'psutil', 'pyzmq', 'argon2-cffi', 'soupsieve', 'pyrsistent', 'executing', 'entrypoints', 'debugpy', 'tinycss2', 'prompt-toolkit', 'matplotlib-inline', 'packaging', 'QtPy', 'pywinpty', 'qtconsole', 'wcwidth', 'defusedxml', 'pyparsing', 'asttokens', 'Pygments', 'beautifulsoup4', 'ipykernel', 'pandocfilters', 'attrs']' returned non-zero exit status 2.
```

何度かjupyterの再インストールとアンインストールを繰り返していたところ、このエラーは毎回、pywin32のアンインストールが成功し、次のパッケージのアンインストールに進むと発生していることがわかりました。

詳しいことはてんでわからないのですが、pywin32が何かしら影響しているのであればという先にアンインストールしてしまえということで、jupyterインストール後`pip uninstall pywin32`でpywin32のみアンインストール後に`pip-autoremove jupyter`を実行したところエラーは出ずしっかりと依存関係のパッケージもアンインストールされていました。

ちなみにrequirements.txtにjupyterと依存関係諸々のパッケージを記載して`pip uninstall -r　-y requirements.txt`でアンインストールしてみたところエラーが出なかったです。やってることは同じようなことに感じるのですがpip-autoremoveでだけエラーがなぜ出るのかは私の頭ではさっぱり不明。

根本的な解決には至っていませんがこんなことあったよということで書いておきました。

</details>

## list インストールされているライブラリを表示する
listコマンドを使って、現在インストールされているライブラリの一覧を表示することができます。
並び順はライブラリ名でソートされているようです。

### 標準的な一覧表示
以下のコマンドでインストールされているライブラリ（パッケージ）とそのバージョンを表示します。

```
pip list
```
```markdown:例
> pip list
Package        Version
-------------- -------
Click          7.0
colorama       0.4.4
Flask          2.1.2
itsdangerous   2.1.2
Jinja2         3.1.2
MarkupSafe     2.1.1
numpy          1.22.3
pip            22.0.4
pip-autoremove 0.10.0
pipdeptree     2.2.1
setuptools     62.1.0
Werkzeug       2.1.2
```

### オプション
`list`コマンドでは`General Options`に加えて`List Options`が使用できます。
オプションによってリスト化するライブラリの対象を選択したり表示形式を変えられます。

<details><summary>Install Options</summary>

|オプション|説明|
|:--------|:-----|
|-o, --outdated|List outdated packages<br>バージョンが最新ではないライブラリのリストを表示する。|
|-u, --uptodate|List uptodate packages<br>バージョンが最新であるライブラリのリストを表示する。|
|-e, --editable|List editable projects.<br>編集可能であるライブラリのリストを表示する。|
|-l, --local|If in a virtualenv that has global access, do not list globally-installed packages.<br>仮想環境がグローバル環境に存在する場合、グローバル環境にインストールされたライブラリを表示しない？|
|--user|Only output packages installed in user-site.<br>ユーザーディレクトリにインストールされたライブラリのリストを表示する。(`pip install --user hoge`でインストールされたやつら)|
|--path <path>|Restrict to the specified installation path for listing packages (can be used multiple times).<br>指定されたフォルダにインストールされたライブラリのリストを表示する？|
|--pre|Include pre-release and development versions. By default, pip only finds stable versions.<br>リストにプレリリースバージョンも含めて表示する。|
|--format <list_format>|Select the output format among: columns (default), freeze, or json<br>出力のフォーマットを`colums`、`freeze`、`json`から指定できる。デフォルトは`columns`|
|--not-required|List packages that are not dependencies of installed packages.<br>他のライブラリに依存されていないライブラリのリストを表示する。|
|--exclude-editable|Exclude editable package from output.<br>編集可能なライブラリをリストから除く。|
|--include-editable|Include editable package from output.<br>編集可能なライブラリをリストに含める。|
|--exclude <package>|Exclude specified package from the output<br>指定したライブラリをリストから除外する。|


</details>

オプションを指定する際の記述は以下

```
pip list [オプション]
```

```markdown:例
##プレリリースバージョンを含めてバージョンが最新ではないライブラリ一覧を表示
> pip list -o --pre
Package    Version Latest Type
---------- ------- ------ -----
Click      7.0     8.1.3  wheel
pip        22.0.4  22.1   wheel
setuptools 62.1.0  62.2.0 wheel
```

## show ライブラリの情報を表示する
`show`コマンドを使用してインストールしたライブラリに関する情報を表示することができます。

### 標準的な情報表示
以下のコマンドで指定したライブラリの情報を確認できます。

```
pip show ライブラリ名
```
```shell-session:例
> pip show flask
Name: Flask
Version: 2.1.2
Summary: A simple framework for building complex web applications.
Home-page: https://palletsprojects.com/p/flask
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD-3-Clause
Location: c:\workspace\python\venv\piptest\lib\site-packages
Requires: click, itsdangerous, Jinja2, Werkzeug
Required-by:
```

### オプション

`show`コマンドでは`General Options`に加えて`Show Options`が使用できます。

<details><summary>Show Options</summary>

|オプション|説明|
|:--------|:-----|
|-f, --files|Show the full list of installed files for each package.ライブラリに含まれているファイル全てをリストで表示する。|


</details>

オプションを指定する際の記述は以下

```
pip show [オプション] ライブラリ名
```

## freeze インストールされたライブラリを要件ファイルのフォーマットで出力する
`freeze`コマンドを使うとインストールされているライブラリの一覧を`install`、`uninstall`コマンドの`-r`オプションで読み込む要件ファイル(requirements.txt)のフォーマットで出力できます。
このコマンドを使うことで自分のライブラリ環境を他人が楽に再現できます。

### 標準的な出力

以下のコマンドで一覧を出力できます。

```
pip freeze
```
```shell-session:例
> pip freeze
Click==7.0
colorama==0.4.4
Flask==2.1.2
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
numpy==1.22.3
pip-autoremove==0.10.0
pipdeptree==2.2.1
Werkzeug==2.1.2
```
:::note
`pip list --format=freeze`でも`freeze`同様のフォーマットで出力できるが、`freeze`で出力されるリストと異なりpip、setuptools等のパッケージ管理ツールも含まれるらしい。

```:例
> pip list --format=freeze
Click==7.0
colorama==0.4.4
Flask==2.1.2
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
numpy==1.22.3
pip==22.0.4
pip-autoremove==0.10.0
pipdeptree==2.2.1
setuptools==62.1.0
Werkzeug==2.1.2
```

:::

出力内容をテキストデータに出力する際はコマンドの後ろに`> [テキストファイル]`を付ければよい。
これはpipやPythonの機能ではなく、コマンドプロンプトやpowershellの機能なので`[コマンド] < [テキストファイル]`でfreezeに限らずコマンドの内容をテキストに出力できるらしい。

```:例
pip ferrze > requirements.txt

pip ferrze > C:\WorkSpace\requirements.txt
```

参考

http://www.isc.meiji.ac.jp/~ri03037/ICTappli1/step06.html

### オプション
`show`コマンドでは`General Options`に加えて`Show Options`が使用できます。

<details><summary>Show Options</summary>

|オプション|説明|
|:--------|:-----|
|-r, --requirement <file>| Use the order in the given requirements file and its comments when generating output. This option can be used multiple times.要件ファイルの内容に従ってリストを出力する？|
|-l, --local|If in a virtualenv that has global access, do not output globally-installed packages.<br>仮想環境がグローバル環境に存在する場合、グローバル環境にインストールされたライブラリを表示しない？|
|--user|Only output packages installed in user-site.<br>ユーザーディレクトリにインストールされたライブラリのリストを表示する。(`pip install --user hoge`でインストールされたやつら)|
|--path <path>|Restrict to the specified installation path for listing packages (can be used multiple times).<br>指定されたフォルダにインストールされたライブラリのリストを表示する？|
|--all|Do not skip these packages in the output: setuptools, wheel, distribute, pip<br>setuptools、 wheel、distribute、pipなどのパッケージ管理ツールも含んでリストを表示する。(`pip list --format=freeze`と同じ結果になると予想)|
|--exclude-editable|Exclude editable package from output.<br>編集可能なライブラリをリストから除く。|
|--exclude <package>|Exclude specified package from the output<br>指定したライブラリをリストから除外する。|

</details>

オプションを指定する際の記述は以下

```
pip freeze [オプション]
```

## check 依存関係の状態をチェックする
`check`コマンドを使ってインストールしているライブラリの依存関係に問題がないか確認することができます。

### 標準の状態確認
以下のコマンドで確認できます。

```
pip check
```

```markdown:例
##依存関係に問題がない場合
> pip check
No broken requirements found.

##動作要件のライブラリがインストールされていない場合
##flaskのバージョン2.1.2にはclickが必要だがインストールされていない
> pip check
flask 2.1.2 requires click, which is not installed.

##動作要件のライブラリのバージョンが要件を満たしていない場合
##flaskのバージョン2.1.2にはclickのバージョン8.0以上が必要だがインストールされているバージョンが7.0
> pip check
flask 2.1.2 has requirement click>=8.0, but you have click 7.0.

```
:::note
特定のライブラリの依存関係は`pipdeptree`というパッケージを使うとツリー形式で確認できる。
```markdown:例
##pipdeptreeのインストール
>pip install pipdeptree

## flaskの依存関係を要求バージョン等込みで表示
> pipdeptree -p flask
Flask==2.1.2
  - click [required: >=8.0, installed: 8.0.4]
    - colorama [required: Any, installed: 0.4.4]
  - itsdangerous [required: >=2.0, installed: 2.1.2]
  - Jinja2 [required: >=3.0, installed: 3.1.2]
    - MarkupSafe [required: >=2.0, installed: 2.1.1]
  - Werkzeug [required: >=2.0, installed: 2.1.2]
```
参考:https://qiita.com/tmurakami1234/items/b407dc4cc558564882bf
:::

### オプション
`check`コマンドでは`General Options`が使用できます。

オプションを指定する際の記述は以下

```
pip check [オプション]
```

## download ライブラリをインストールせずダウンロードする
`download`コマンドを使うことでライブラリをダウンロードすることができる。使う場面としてはオフライン環境でライブラリのインストールを行うため、あらかじめダウンロードのみしておく時などがあるらしい。

### 標準的なダウンロード
以下のコマンドで特にオプション等で指定もしなければ依存関係のパッケージもまとめて最新版がカレントディレクトリにダウンロードされる。
ダウンロードしたファイルを用いてインストールする際は`pip installダウンロードしたファイルのパス`でインストールできるらしい。
`install`同様PyPI以外のリポジトリやローカルのファイルからもライブラリのインストールを行える。

```
pip download ライブラリ名 
pip download -r 要件ファイル 
pip download VCSプロジェクトのURL 
pip download ローカルプロジェクトのパス 
pip download アーカイブのURLかパス 
```

```:例
#試しにnumpyとflaskをダウンロードしてみる。

(piptest) PS C:\WorkSpace\Python\Practice> pip download numpy
Collecting numpy
  Using cached numpy-1.22.3-cp310-cp310-win_amd64.whl (14.7 MB)
Saved c:\workspace\python\practice\numpy-1.22.3-cp310-cp310-win_amd64.whl
Successfully downloaded numpy

(piptest) PS C:\WorkSpace\Python\Practice> pip download flask
Collecting flask
  Using cached Flask-2.1.2-py3-none-any.whl (95 kB)
Collecting Werkzeug>=2.0
  Using cached Werkzeug-2.1.2-py3-none-any.whl (224 kB)
Collecting Jinja2>=3.0
  Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
Collecting click>=8.0
  Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting itsdangerous>=2.0
  Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting colorama
  Using cached colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Collecting MarkupSafe>=2.0
  Using cached MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl (17 kB)
Saved c:\workspace\python\practice\flask-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\click-8.1.3-py3-none-any.whl
Saved c:\workspace\python\practice\itsdangerous-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\jinja2-3.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\werkzeug-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\markupsafe-2.1.1-cp310-cp310-win_amd64.whl       
Saved c:\workspace\python\practice\colorama-0.4.4-py2.py3-none-any.whl
Successfully downloaded flask click itsdangerous Jinja2 Werkzeug MarkupSafe colorama

#ダウンロードしたnumpy-1.22.3-cp310-cp310-win_amd64.whlを使ってnumpyをインストールする
#カレントディレクトリにダウンロードしたのでパスはファイル名のみでよい
(piptest) PS C:\WorkSpace\Python\Practice> pip install numpy-1.22.3-cp310-cp310-win_amd64.whl
Processing c:\workspace\python\practice\numpy-1.22.3-cp310-cp310-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.22.3
```

### オプション、引数
`download`コマンドでは`General Options`に加えて`Download Options`が使用できます。

<details><summary>Download Options</summary>

|オプション|説明|
|:--------|:-----|
|-c, --constraint <file>|Constrain versions using the given constraints file. This option can be used multiple times.<br>指定された制約ファイルの記述を参照してバージョンを管理する。|
|-r, --requirement <file>|Install from the given requirements file. This option can be used multiple times.<br>指定された要件ファイルの記述を参照してライブラリをダウンロードする。|
|--no-deps|Don't install package dependencies.<br>依存関係のライブラリをダウンロードしない。|
|--global-option <options>|Extra global options to be supplied to the setup.py call before the install or bdist_wheel command.|
|--no-binary <format_control>|Do not use binary packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all binary packages, ":none:" to empty the set (notice the colons), or one or more package names with commas between them (no colons). Note that some packages are tricky to compile and may fail to install when this option is used on them.|
|--only-binary <format_control>|Do not use source packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all source packages, ":none:" to empty the set, or one or more package names with commas between them. Packages without binary distributions will fail to install when this option is used on them.|
|--prefer-binary|Prefer older binary packages over newer source packages.|
|--src <dir>|Directory to check out editable projects into. The default in a virtualenv is "<venv path>/src". The default for global installs is "<current dir>/src".|
|--pre|Include pre-release and development versions. By default, pip only finds stable versions.<br>ダウンロード対象のバージョンにプレリリースバージョンと開発バージョンを含める。デフォルト(--preオプションを使用しなければ)ではインストール対象は安定したバージョンのみとなる。|
|--require-hashes|Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a requirements file has a --hash option.|
|--progress-bar <progress_bar>|Specify type of progress to be displayed [off|on|ascii|pretty|emoji] (default: on)<br>プログレスバーの表示のオンオフ、表示形式を(`on`、`off`、`ascii`、`pretty`、`emoji`)から選択する。デフォルトでは`on`。|
|--no-build-isolation|Disable isolation when building a modern source distribution. Build dependencies specified by PEP 518 must be already installed if this option is used.|
|--use-pep517|Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy behaviour).|
|--ignore-requires-python|Ignore the Requires-Python information.|
|-d, --dest <dir>|Download packages into <dir>.<br>ライブラリを指定のフォルダにダウンロードする。|
|--platform <platform>|Only use wheels compatible with <platform>. Defaults to the platform of the running system. Use this option multiple times to specify multiple platforms supported by the target interpreter.|
|--python-version <python_version>|The Python interpreter version to use for wheel and "Requires-Python" compatibility checks. Defaults to a version derived from the running interpreter. The version can be specified using up to three dot-separated integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor version can also be given as a string without dots (e.g. "37" for 3.7.0).|
|--implementation <implementation>|Only use wheels compatible with Python implementation <implementation>, e.g. 'pp', 'jy', 'cp',  or 'ip'. If not specified, then the current interpreter implementation is used.  Use 'py' to force implementation-agnostic wheels.|
|--abi <abi>|Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not specified, then the current interpreter abi tag is used. Use this option multiple times to specify multiple abis supported by the target interpreter. Generally you will need to specify --implementation, --platform, and --python-version when using this option.|
|--no-clean|Don't clean up build directories.|


</details>

オプションを指定する際の記述は以下

```
pip download [オプション] ライブラリ名 バージョン指定子 [パッケージインデックスオプション] 
pip download [オプション] -r 要件ファイルのパス [パッケージインデックスオプション] 
pip download [オプション] VCSプロジェクトのURL 
pip download [オプション] ローカルプロジェクトのパス 
pip download [オプション] アーカイブのURLかパス 
```


## wheel Wheelアーカイブの構築
`wheel`コマンドを使うと、wheelというPythonのライブラリの形式であるアーカイブファイル(.whl)を作成できるらしい。作ったライブラリを配布する時とかに使うとのこと。

参考

https://peps.python.org/pep-0427/

### Wheelファイルの作成
オプションを設定しない場合、以下のコマンドでカレントディレクトリに指定したライブラリと依存関係をまとめたWheelが作成される。

```
pip wheel ライブラリ名
pip wheel -r 要件ファイルのパス
pip wheel [-e] VCSプロジェクトのURL
pip wheel [-e] ローカルプロジェクトのパス
pip wheel アーカイブのURL、パス
```
```:例
#試しにflaskのwheelファイルを作成してみる

(piptest) PS C:\WorkSpace\Python\Practice> pip wheel flask
Collecting flask
  Using cached Flask-2.1.2-py3-none-any.whl (95 kB)
Collecting itsdangerous>=2.0
  Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting Werkzeug>=2.0
  Using cached Werkzeug-2.1.2-py3-none-any.whl (224 kB)
Collecting click>=8.0
  Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting Jinja2>=3.0
  Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
Collecting colorama
  Using cached colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Collecting MarkupSafe>=2.0
  Using cached MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl (17 kB)
Saved c:\workspace\python\practice\flask-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\click-8.1.3-py3-none-any.whl
Saved c:\workspace\python\practice\itsdangerous-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\jinja2-3.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\werkzeug-2.1.2-py3-none-any.whl
Saved c:\workspace\python\practice\markupsafe-2.1.1-cp310-cp310-win_amd64.whl
Saved c:\workspace\python\practice\colorama-0.4.4-py2.py3-none-any.whl
```
### オプション、引数
`wheel`コマンドでは`General Options`に加えて`Wheel Options`が使用できます。

<details><summary>Wheel Options</summary>

|オプション|説明|
|:--------|:-----|
|-w, --wheel-dir <dir>|Build wheels into <dir>, where the default is the current working directory.<br>指定したフォルダにwheelファイルを作成する。|
|--no-binary <format_control>|Do not use binary packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all binary packages, ":none:" to empty the set (notice the colons), or one or more package names with commas between them (no colons). Note that some packages are tricky to compile and may fail to install when this option is used on them.|
|--only-binary <format_control>|Do not use source packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either ":all:" to disable all source packages, ":none:" to empty the set, or one or more package names with commas between them. Packages without binary distributions will fail to install when this option is used on them.|
|--prefer-binary|Prefer older binary packages over newer source packages.|
|--no-build-isolation|Disable isolation when building a modern source distribution. Build dependencies specified by PEP 518 must be already installed if this option is used.|
|--use-pep517|Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy behaviour).|
|-c, --constraint <file>|Constrain versions using the given constraints file. This option can be used multiple times.<br>指定された制約ファイルの記述を参照してバージョンを管理する。|
|-e, --editable <path/url>|Install a project in editable mode (i.e. setuptools "develop mode") from a local project path or a VCS url.|
|-r, --requirement <file>|Install from the given requirements file. This option can be used multiple times.<br>指定された要件ファイルの記述を参照してwheelファイルを作成する。|
|--src <dir>|Directory to check out editable projects into. The default in a virtualenv is "<venv path>/src". The default for global installs is "<current dir>/src".|
|--ignore-requires-python|Ignore the Requires-Python information.|
|--no-deps|Don't install package dependencies.<br>依存関係のwheelファイルを作成しない。|
|--progress-bar <progress_bar>|Specify type of progress to be displayed [off|on|ascii|pretty|emoji] (default: on)<br>プログレスバーの表示のオンオフ、表示形式を(`on`、`off`、`ascii`、`pretty`、`emoji`)から選択する。デフォルトでは`on`。|
|--no-verify|Don't verify if built wheel is valid.|
|--build-option <options>|Extra arguments to be supplied to 'setup.py bdist_wheel'.|
|--global-option <options>|Extra global options to be supplied to the setup.py call before the install or bdist_wheel command.|
|--pre|Include pre-release and development versions. By default, pip only finds stable versions.<br>Wheelファイルを作成するバージョンにプレリリース版を含める。|
|--require-hashes|Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a requirements file has a --hash option.|
|--no-clean|Don't clean up build directories.|



</details>

オプションを指定する際の記述は以下

```
pip wheel [オプション] ライブラリ名 バージョン指定子 [パッケージインデックスオプション] 
pip wheel [オプション] -r 要件ファイルのパス [パッケージインデックスオプション] 
pip wheel [オプション] VCSプロジェクトのURL 
pip wheel [オプション] ローカルプロジェクトのパス 
pip wheel [オプション] アーカイブのURLかパス 
```

## hash ハッシュ値を計算する
`hash`コマンドを使うとローカルにあるライブラリのアーカイブファイルのハッシュ値を計算できるらしい。
pipにはハッシュチェックモードというものがありその際に使用するハッシュ値を求めるもとのこと。

### ハッシュとは
ハッシュ値とは特定の計算手法で求められる一定の長さの値で、同じ値を再現するのは難しく元データが改変されていないか等を確認するのに使用されたりするとのこと。

>**ハッシュ値 【hash value】 ダイジェスト値 / digest value / 要約値**
>ハッシュ値とは、元になるデータから一定の計算手順により求められた固定長の値。その性質から暗号や認証、データ構造などに応用されている。ハッシュ値を求めるための計算手順のことをハッシュ関数、要約関数、メッセージダイジェスト関数などという。
>ハッシュ値は元のデータの長さによらず一定の長さとなっており、同じデータからは必ず同じハッシュ値が得られる。実用上は数バイトから数十バイト程度の長さとすることが多い。計算過程で情報の欠損が起きる不可逆な変換が含まれ、ハッシュ値から元のデータを復元することはできない。
>ハッシュ値は元のデータの特徴を表す短い符号として利用することができ、データの比較や検索を高速化することができる。例えば、大きな容量のファイルの内容が同一であるかを比較する際に端から順にすべてのデータを照合すれば時間が掛かるが、それぞれハッシュ値を計算しておいて比較すれば一致するかどうかは一瞬で判別することができる。
>参考：https://e-words.jp/w/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%80%A4.html

https://pip.pypa.io/en/stable/topics/repeatable-installs/#hash-checking

### 標準のハッシュ値の計算
ハッシュ値の計算は以下のコマンドで実行できる。
```
pip hash アーカイブデータのパス
```
```:例
#試しにさっきダウンロードしておいたnumpyのwheelファイルのハッシュ値を計算してみる。
#カレントフォルダにダウンロードしたのでファイル名のみで実行
> pip hash numpy-1.22.3-cp310-cp310-win_amd64.whl
numpy-1.22.3-cp310-cp310-win_amd64.whl:
--hash=sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4
```

### オプション
`hash`コマンドでは`General Options`に加えて`Hash Options`が使用できます。

<details><summary>Hash Options</summary>

|オプション|説明|
|:--------|:-----|
|-a, --algorithm <algorithm>|The hash algorithm to use: one of sha256, sha384, sha512<br>ハッシュ値を計算するアルゴリズムを`sha256`、`sha384`、`sha512`の中から選択する。|

</details>

オプションを指定する際の記述は以下

```
pip hash [オプション] アーカイブデータのパス
```
## search ライブラリを検索する。
`search`コマンドはPyPIのライブラリを検索することができるそうなのですが、実行すると以下のエラー文が表示されました。

```
> pip search jupyter
ERROR: XMLRPC request failed [code: -32500]
RuntimeError: PyPI's XMLRPC API is currently disabled due to unmanageable load and will be deprecated in the near future. See https://status.python.org/ for more information.
```
どうやらPyPIのXMLRPC APIが現在無効になっているため検索できないらしいです。
検索してみたときに無効になっていただけなのか、ずっと無効になっているのかは不明ですが、近い将来非推奨になる方法とのことなので違う方法でライブラリを検索してみようと思います。

### その他のライブラリ検索方法

1. webブラウザでPyPIのサイトから検索する
XMLRPC APIが落ちているのでpipの`search`コマンドで検索できませんでしたが、別に[PyPIのサイト](https://pypi.org/)自体が落ちているわけではないので、webブラウザでhttps://pypi.org/ にアクセスして検索ボックスで検索すればライブラリは検索できます。

2. pip-searchを使う
いちいちブラウザ立ち上げてPyPIで検索するのが面倒な場合、[pip-search](https://pypi.org/project/pip-search/)というパッケージを利用してライブラリを検索できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5a54ec9d-ec54-7cfb-6809-d3db2765f61b.png)


**(2022.06.07追記）**
pip-searchについて記事投稿時は以下のような状況だったが、日を置いて再度インストールした後に使用してみたところ問題なく動いた。

~~インストールして使ってみたがエラーがでて検索できなかった。~~
~~エラーメッセージを読んでみても私の能力では理解も対応もできなかったのであきらめました。~~

```
> pip_search hoge
Traceback (most recent call last):
  File "C:\WorkSpace\Python\venv\piptest\Scripts\pip_search-script.py", line 33, in <module>
    sys.exit(load_entry_point('pip-search==0.0.11', 'console_scripts', 'pip_search')())
    snippet.select_one('span[class*="released"]').find("time")[
AttributeError: 'NoneType' object has no attribute 'find'
```

## cache キャッシュを管理する
`cache`コマンドでpipのwheelのキャッシュの管理ができるらしい。
（キャッシュを使って何をするとかはわかっていないがそういう機能があるらしい。）
wheelのキャッシュはPyPIにwheelファイルがない場合にpipでライブラリをインストールすると、内部的にwheelファイルを作成しそれを使ってインストールを行っているらしく、その作成されたwheelファイルがキャッシュとして保存されているとのこと。

参考

https://blog.amedama.jp/entry/2015/12/01/000100

### 使い方

`cache`コマンドはサブコマンドを組み合わせて使う。

```
pip cache dir
pip cache info
pip cache list [<pattern>]
pip cache remove <pattern>
pip cache purge

#<pattern>にはパッケージ名かglob式が入る
#[]の項目は省略可

```
|サブコマンド|説明|
|:-|:-|
|dir|Show the cache directory.<br>キャッシュの保存されている場所を表示する。|
|info|Show information about the cache.<br>キャッシュに関する情報を表示する。|
|list|List filenames of packages stored in the cache.<br>キャッシュに保存されているパッケージのファイル名を一覧表示する。|
|remove|Remove one or more package from the cache.<br>キャッシュから１つ以上のパッケージを削除する。|
|purge|Remove all items from the cache.<br>すべてのキャッシュを削除します。|

```:例
#キャッシュの保存されているディレクトリを表示
> pip cache dir
c:\users\ユーザー名\appdata\local\pip\cache

#キャッシュの情報を表示
> pip cache info
Package index page cache location: c:\users\ユーザー名\appdata\local\pip\cache\http
Package index page cache size: 143.4 MB
Number of HTTP files: 216
Wheels location: c:\users\ユーザー名\appdata\local\pip\cache\wheels
Wheels size: 7.5 kB
Number of wheels: 1

#キャッシュのリストを表示
> pip cache list  
Cache contents:

 - urwid_readline-0.13-py3-none-any.whl (7.5 kB)

#キャッシュの削除（パッケージ名を指定）
> pip cache remove urwid_readline
Files removed: 1

#キャッシュの削除（全キャッシュ削除）
> pip cache purge
Files removed: 217

```

### オプション

`cache`コマンドでは`General Options`に加えてサブコマンドの`list`で`Cache Options`が使用できます。

<details><summary>Cache Options</summary>

|オプション|説明|
|:--------|:-----|
|--format <list_format>|Select the output format among: human (default) or abspath<br>出力形式を`human`か`abspath`かで指定できる。（デフォルトは`human`）|

</details>

オプションを指定する際の記述は以下

```
pip cache list [<pattern>] [--format=[human, abspath]]
```
```:例
> pip cache list --format=abspath
c:\users\ユーザー名\appdata\local\pip\cache\wheels\58\1d\d8\20c6d76afd5bd205f5f95f19640df9a4e88fc6f1a4c25bb693\urwid_readline-0.13-py3-none-any.whl
```
## config 構成の管理
`config`コマンドを使うことで構成の管理ができるらしい。
説明を読んでも使いどころ等がさっぱりわからないがこういう機能があるということで整理しておきます。

### 使い方
`cache`同様サブコマンドを組み合わせて使用するらしい。
```
python -m pip config [<file-option>] list
python -m pip config [<file-option>] [--editor <editor-path>] edit
python -m pip config [<file-option>] get command.option
python -m pip config [<file-option>] set command.option value
python -m pip config [<file-option>] unset command.option
python -m pip config [<file-option>] debug
```
|サブコマンド|説明|
|:---------------------|:-|
|list|List the active configuration (or from the file specified)<br>アクティブまたは指定したファイルの構成のリストを表示する。|
|edit|Edit the configuration file in an editor<br>エディターを使用して構成ファイルを編集する。|
|get|Get the value associated with command.option<br>`command.option`に設定された値を取得する。|
|set|Set the command.option=value<br>`command.option`に値を設定する。|
|unset|Unset the value associated with command.option`command.option`に設定された値を解除する。|
|debug|List the configuration files and values defined under them<br>構成ファイルとそれの下に連なる値のリストを表示する。|

### オプション

`config`コマンドでは`General Options`に加えて`Config Options`が使用できます。

<details><summary>Config Options</summary>

|オプション|説明|
|:--------|:-----|
|--editor <editor>|Editor to use to edit the file. Uses VISUAL or EDITOR environment variables if not provided.<br>サブコマンドの`edit`のオプション。`edit`コマンドで使うエディターを指定できる。|
|--global|Use the system-wide configuration file only<br>システム全体の構成ファイルのみ使用する。|
|--user|Use the user configuration file only<br>ユーザの構成ファイルのみ使用する|
|--site|Use the current environment configuration file only<br>現在の仮想環境の構成ファイルのみを使用する|

</details>

https://pip.pypa.io/en/stable/topics/configuration/

## debug デバッグ情報の表示
`debg`コマンドでデバック情報の表示ができるらしい。
これも説明を読んでも実際何に使うのかがわからないのでそんな機能があるんだな程度に把握しておきます。

### 使いかた
以下のコマンドでpipを実行する環境のなんやかんやの情報が表示できる。
下の方の`Compatible tags`の部分は10個以外は省略されているが、`-v`か`--verbose`オプションで全部表示できるらしい。
```
pip debug
```
```:例
> pip debug
WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command may change without notice.
pip version: pip 22.1 from C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip (python 3.10)
sys.version: 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]
sys.executable: C:\WorkSpace\Python\venv\piptest\Scripts\python.exe
sys.getdefaultencoding: utf-8
sys.getfilesystemencoding: utf-8
locale.getpreferredencoding: cp932
sys.platform: win32
sys.implementation:
  name: cpython
'cert' config value: Not specified
REQUESTS_CA_BUNDLE: None
CURL_CA_BUNDLE: None
pip._vendor.certifi.where(): C:\WorkSpace\Python\venv\piptest\lib\site-packages\pip\_vendor\certifi\cacert.pem
pip._vendor.DEBUNDLED: False
vendored library versions:
  CacheControl==0.12.11
  colorama==0.4.4
  distlib==0.3.3
  distro==1.7.0
  html5lib==1.1
  msgpack==1.0.3 (Unable to locate actual module version, using vendor.txt specified version)
  packaging==21.3
  pep517==0.12.0
  platformdirs==2.5.2
  pyparsing==3.0.8
  requests==2.27.1
  certifi==2021.10.08
  chardet==4.0.0
  idna==3.3
  urllib3==1.26.9
  rich==12.2.0 (Unable to locate actual module version, using vendor.txt specified version)
  pygments==2.11.2
  typing_extensions==4.2.0 (Unable to locate actual module version, using vendor.txt specified version)
  resolvelib==0.8.1
  setuptools==44.0.0 (Unable to locate actual module version, using vendor.txt specified version)
  six==1.16.0
  tenacity==8.0.1 (Unable to locate actual module version, using vendor.txt specified version)
  tomli==2.0.1
  webencodings==0.5.1 (Unable to locate actual module version, using vendor.txt specified version)
Compatible tags: 36
  cp310-cp310-win_amd64
  cp310-abi3-win_amd64
  cp310-none-win_amd64
  cp39-abi3-win_amd64
  cp38-abi3-win_amd64
  cp37-abi3-win_amd64
  cp36-abi3-win_amd64
  cp35-abi3-win_amd64
  cp34-abi3-win_amd64
  cp33-abi3-win_amd64
  ...
  [First 10 tags shown. Pass --verbose to show all.]
```

### オプション

`debug`コマンドでは`General Options`に加えて`Debug Options`が使用できます。
オプションの説明を読んでも理解が及ばなかったので`help`で表示される文章をそのまま整理。
（使うときが来たらまた勉強します。）

<details><summary>Debug Options</summary>

|オプション|説明|
|:--------|:-----|
|--platform <platform>|Only use wheels compatible with <platform>. Defaults to the platform of the running system. Use this option multiple times to specify multiple platforms supported by the target interpreter.|
|--python-version <python_version>|The Python interpreter version to use for wheel and "Requires-Python" compatibility checks. Defaults to a version derived from the running interpreter. The version can be specified using up to three dot-separated integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor version can also be given as a string without dots (e.g. "37" for 3.7.0).|
|--implementation <implementation>|Only use wheels compatible with Python implementation <implementation>, e.g. 'pp', 'jy', 'cp',  or 'ip'. If not specified, then the current interpreter implementation is used.  Use 'py' to force implementation-agnostic wheels.|
|--abi <abi>|Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not specified, then the current interpreter abi tag is used. Use this option multiple times to specify multiple abis supported by the target interpreter. Generally you will need to specify --implementation, --platform, and --python-version when using this option.|

</details>