Python 3 エンジニア認定実践試験対策 (2)　- requirements.txt / constraints.txt

Pythonを数年使ってきて、改めて知識の整理と最新仕様のキャッチアップのために Python 3 エンジニア認定実践試験を受験しようと思い、私的に作成した資料から簡易版を作成しました。
最後に練習問題を設けましたので、解説を読んだら記憶定着のために練習問題へチャレンジしてください。最後に答えを掲載しています。

# Python パッケージバージョンの統一管理

## 1. requirements.txtとは？
`requirements.txt`は、異なる環境（開発環境や本番環境など）で同じパッケージバージョンに統一するために使用するファイルです。
- 環境ごとに異なるバージョンを使うと、不具合が発生することがあります。
このファイルを使うことで、パッケージのバージョンを統一できます。

## 2. requirements.txtの作成
### 自動作成
```bash
pip freeze > requirements.txt  # 現在の環境のパッケージとバージョンを一覧にしたファイルを作成
```

## 3. requirements.txtの書式
- コメントは `#` で始まる行です。
- 例:
  ```plaintext
  foo==1.0.0          # 特定のバージョンを指定
  bar<2.0.0,>=1.2.0  # バージョンの範囲を指定
  ```
- バージョンを指定しない場合、最新バージョンがインストールされます。

## 4. requirements.txtを使ったインストール
```bash
pip install -r requirements.txt  # requirements.txtに記載されたパッケージをインストール
```

## 5. constraints.txtとは？
`constraints.txt`は、`requirements.txt`で指定したパッケージと依存関係にあるパッケージが自動的にインストールされる際のバージョンを強制的に指定するためのファイルです。
複数のプロジェクトで異なるバージョンの依存関係が衝突するのを防ぎます。

## 6. constraints.txtの書式
- 書き方は `requirements.txt` と同じです。
- 例:
  ```plaintext
  python-pypypy==3.0.0  # 特定のバージョンを指定
  ```

## 7. constraints.txtを使ったインストール
```bash
pip install -r requirements.txt -c constraints.txt  # 両方のファイルを指定してインストール
```
- `constraints.txt`に指定するパッケージ名は、`requirements.txt`にも書かれている必要があります。
- `requirements.txt`にはパッケージ名だけを記述し、`constraints.txt`にはパッケージ名とバージョンを記載しておく必要があります。

## 8. バージョンの制約
- `requirements.txt`と`constraints.txt`の両方にバージョンを指定してしまってもエラーにはなりませんが、バージョン指定が矛盾するとインストールに失敗します。
- 例:
  ```plaintext
  requirements.txt: psycopg2-binary<2.9.1
  constraints.txt: psycopg2-binary==2.9.1
  ```

## 9. 別のPythonに紐づくpipを指定して使う方法
### pipとpythonの対応を確認
```bash
pip -V  # 現在のpipのバージョンと関連付けられているPythonバージョンを確認
```

### 特定のPythonバージョンのpipを指定して使う
- **方法1**: バージョン番号をつけた `pip` を使用する。
  ```bash
  pip3.9 install パッケージ名  # Python 3.9用のpipを使用
  ```
- **方法2**: バージョン番号をつけた `python` コマンドを使う。
  ```bash
  python3.9 -m pip install パッケージ名  # Python 3.9のpipを使用
  ```

---
# Python パッケージバージョンの統一管理 - 確認問題

1. requirements.txtの主な目的は何ですか？
   a) Pythonのバージョンを管理するためのファイル  
   b) 異なる環境で同じパッケージバージョンを使用するためのファイル  
   c) プロジェクトのドキュメントを作成するためのファイル  
   d) パッケージの依存関係を自動的に解決するためのファイル  

2. requirements.txtを自動で作成するコマンドはどれですか？
   a) `pip install requirements.txt`  
   b) `pip freeze > requirements.txt`  
   c) `pip create requirements.txt`  
   d) `pip generate requirements.txt`  

3. requirements.txtの書式で、特定のバージョンを指定する場合の正しい記述はどれですか？
   a) `foo:1.0.0`  
   b) `foo==1.0.0`  
   c) `foo<1.0.0`  
   d) `foo=1.0.0`  

4. constraints.txtの役割は何ですか？
   a) プロジェクトのドキュメントを管理する  
   b) requirements.txtで指定したパッケージの依存関係パッケージのバージョンを制限する  
   c) Pythonのバージョンを指定する  
   d) パッケージのインストールを自動化する  

5. constraints.txtを使ったインストールのコマンドはどれですか？
   a) `pip install -r requirements.txt`  
   b) `pip install -c constraints.txt`  
   c) `pip install -r requirements.txt -c constraints.txt`  
   d) `pip install constraints.txt`  

6. 特定のPythonバージョンのpipを使用する方法として正しいものはどれですか？
   a) `pip3.9 install <package_name>`  
   b) `python -m pip3.9 install <package_name>`  
   c) `python3.9 -m pip install <package_name>`  
   d) aとcの両方  

7. requirements.txtとconstraints.txtのバージョン指定が矛盾した場合、どうなりますか？
   a) インストールが成功する  
   b) 警告が表示される  
   c) インストールに失敗する  
   d) 自動的に最新バージョンがインストールされる  

8. requirements.txtに記載されていないパッケージをconstraints.txtで指定した場合、どうなりますか？
   a) エラーが発生する  
   b) 無視される  
   c) 自動的にインストールされる  
   d) 警告が表示される  

解答:
1. b  
2. b  
3. b  
4. b  
5. c  
6. d  
7. c  
8. b