Pythonのパッケージビルドとインストールの標準、PEP517とは？


### **user**:

ChatGPT先生！助けてください！

```
!pip install gfpgan
```

しようとしたら次のエラーになりました。

```
Defaulting to user installation because normal site-packages is not writeable
Collecting gfpgan
  Downloading gfpgan-1.3.8-py3-none-any.whl.metadata (12 kB)
Collecting basicsr>=1.4.2 (from gfpgan)
  Using cached basicsr-1.4.2.tar.gz (172 kB)
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [68 lines of output]
      /usr/local/lib/python3.11/dist-packages/setuptools/__init__.py:83: _DeprecatedInstaller: setuptools.installer and fetch_build_eggs are deprecated.
      !!
      
              ********************************************************************************
              Requirements should be satisfied by a PEP 517 installer.
              If you are using pip, you can try `pip install --use-pep517`.
              ********************************************************************************
      
      !!
        dist.fetch_build_eggs(dist.setup_requires)
      Traceback (most recent call last):
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3369, in _dep_map
          return self.__dep_map
                 ^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3149, in __getattr__
          raise AttributeError(attr)
      AttributeError: _DistInfoDistribution__dep_map
      
      During handling of the above exception, another exception occurred:
      
      Traceback (most recent call last):
        File "<string>", line 2, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "/tmp/pip-install-evcumtoz/basicsr_9356a1ecaf8347529b9f5174f70a7162/setup.py", line 147, in <module>
          setup(
        File "/usr/local/lib/python3.11/dist-packages/setuptools/__init__.py", line 105, in setup
          _install_setup_requires(attrs)
        File "/usr/local/lib/python3.11/dist-packages/setuptools/__init__.py", line 78, in _install_setup_requires
          _fetch_build_eggs(dist)
        File "/usr/local/lib/python3.11/dist-packages/setuptools/__init__.py", line 83, in _fetch_build_eggs
          dist.fetch_build_eggs(dist.setup_requires)
        File "/usr/local/lib/python3.11/dist-packages/setuptools/dist.py", line 641, in fetch_build_eggs
          return _fetch_build_eggs(self, requires)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/setuptools/installer.py", line 38, in _fetch_build_eggs
          resolved_dists = pkg_resources.working_set.resolve(
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 896, in resolve
          new_requirements = dist.requires(req.extras)[::-1]
                             ^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3072, in requires
          dm = self._dep_map
               ^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3371, in _dep_map
          self.__dep_map = self._compute_dependencies()
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3388, in _compute_dependencies
          common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None)))
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/pkg_resources/__init__.py", line 3385, in reqs_for_extra
          if not req.marker or req.marker.evaluate({'extra': extra}):
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/packaging/markers.py", line 241, in evaluate
          return _evaluate_markers(self._markers, current_environment)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/packaging/markers.py", line 150, in _evaluate_markers
          lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/packaging/markers.py", line 124, in _normalize
          return tuple(canonicalize_name(v) for v in values)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/packaging/markers.py", line 124, in <genexpr>
          return tuple(canonicalize_name(v) for v in values)
                       ^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/dist-packages/packaging/utils.py", line 34, in canonicalize_name
          value = _canonicalize_regex.sub("-", name).lower()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      TypeError: expected string or bytes-like object, got 'NoneType'
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
```

---

### **assistant**:

これはね、エラーではあってるけど、あんたが何をしようとしてるかによるんだよね。もし、あんたがGFP-GANをインストールしようとしてるんなら、「python setup.py egg_info」が上手くいかなかったってことになるんだよ。

そもそもGFP-GANのソフトウェア自体が、あんたの使ってるPythonのバージョンや環境に対応してない可能性があるんだよね。それとも、Pythonの依存ライブラリの一部が欠けてたり、あるいは古いバージョンがインストールされてる可能性もあるから、確認してみるといいかもしれないんだよ。

具体的にはね、まずPythonのバージョンが3.7以上かどうか確認してほしいんよ。それと同時に、「torch>=1.7.0」と「torchvision>=0.8.0」がインストールされてるかどうかも確認してみてほしいんだね。

それからね、「pip install --use-pep517」を使ってみると良いかもしれないんだよね。「PEP 517」は、Pythonのパッケージビルドとインストールのプロセスを改善するためのもんなんだけど、これを使うと「python setup.py egg_info」のエラーが解消することがあるんだよ。

で、それでもダメならGFP-GANのGitHubのページに「issue」を投稿してみて、あんたが遭遇したこのエラーについて詳しく書いてみるといいかもしれないんだよ。開発者や他のユーザーからアドバイスをもらえる可能性があるからね。

なんやかんやで、なかなか難儀してるみたいだけど、うちが全力でサポートするから安心してね！どんな問題も乗り越えていける信じてるよ！

---

### **user**:

なるほど、ありがとうございます。

```
pip install --use-pep517 gfpgan
```

とすれば上手くいったようです。この --use-pep517 ってのは何なんですか？

---

### **assistant**:

そうなんや、もう上手くインストールできたんか！よかったね！なんやけど、「--use-pep517」についてはちょっと説明するわ。

PEP517っていうのはPythonのパッケージング仕様で、新しいPythonプロジェクトがビルドと配布を、より一貫した方法で行うことを可能にするためのものなんや。つまりね、Pythonのソフトウェアパッケージをもっと簡単にビルドしたり、インストールできるようにするための基準やルールを決めたもんなんだな。

それで、「--use-pep517」のオプションを使うということは、「PEP 517」に準拠しとるパッケージング方法を使って、Pythonのパッケージをインストールしようとするってことなんや。つまり、あんたがPythonのソフトウェアをインストールするときに、それがPEP 517の基準やルールに従うようにpipに指示するわけ。

言うた通り、PEP517はPythonパッケージのビルドとインストールのプロセスを改善するつもりで作られてるから、それに準拠しとるパッケージがあって、相性問題が出た時とかには「--use-pep517」オプションを使うと問題が解消することがよくあるんだよね。

でも、そんな風にのんびり話している場合ではないんやから、さっさとあんたのプロジェクトに取り掛かってくれたまえよ。うちはあんたがどんな結果を出すのか、ワクワクして待ってるからね！

---

### **user**:

ありがとうございます。今回の議論にタイトルをつけたいんですが、いくつか提案していただけますか？

---

### **assistant**:

もちろん、全然問題ないよ！あんたがちょっと向き合った問題や話題にピッタリなタイトル、ここにいくつか考えてみたんだけどどうかな：

1. "Pythonパッケージング: PEP517とその役割"
2. "PEP517によるPythonパッケージインストールの最適化"
3. "パッケージ依存性問題を解決するPEP517"
4. "Pythonのパッケージビルドとインストールの標準、PEP517とは？"
5. "GFP-GANインストール失敗からの学び: PEP517とパッケージ管理"

あんたのプロジェクトや話題にあうタイトルがあったら選んでくれてええよ。いずれにせよ、作業がスムーズに進むことを心から願ってるよ！

---

### **user**:

ありがとうございます！また今度何かあったら教えてくださいね！

---

### **assistant**:

もちろんやで！あんたがヘルプを必要としたらいつでも呼んでね、全然構わんよ！それまでの間、あんたのプロジェクトが順調に進むことを祈ってるよ。また近いうちに会えることを楽しみにしてるね。それでは、頑張って！

---