インストール時に、ModuleNotFoundErrorが表示される
コンパイル時に numpy のヘッダーファイルをインクルードする必要があるため、 np.get_include()
を setup.py
の中で利用する必要がある。
pip install numpy
pip install cpprb
と2段階でのインストールが行われていたが、 v8.0.1 で、 build_ext
を継承したカスタムクラスを作成し、 numpy を遅延インポートする改善が行われた。
結果として、 pip install cpprb
の1コマンドでインストールが可能になったが、インストール時に ModuleNotFoundError
が発生し、成功しているにも関わらずユーザーに失敗したかのように思わせてしまう。(エラーログは後述)
どうやら、以下のような手順でサブコマンドが実行されることが理由のようである。
- bdist_wheel
- build
- build_py
- build_ext <- 失敗
ModuleNotFoundError
- build
- clean
- install
- install numpy
- install cpprb
- build
- build_py
- build_ext <- 今度は成功
- build
try: ~ except ModuleNotFoundError: ~
で、numpy のインポートエラーを覆い隠してしまうと、 install
時に build
が再実行されないようで、最終的にインストールが失敗してしまう。
root@819e72608688:/# pip install cpprb
Collecting cpprb
Downloading https://files.pythonhosted.org/packages/8e/61/af3119ab82a8f4234999a6ee209f9b32d4b59f79b4f5585ae36f05b3f0e4/cpprb-8.0.1.tar.gz (293kB)
|████████████████████████████████| 296kB 647kB/s
Collecting numpy
Downloading https://files.pythonhosted.org/packages/00/4a/e34fce8f18c0e052c2b49f1b3713469d855f7662d58ae2b82a88341e865b/numpy-1.17.3-cp37-cp37m-manylinux1_x86_64.whl (20.0MB)
|████████████████████████████████| 20.0MB 7.6MB/s
Building wheels for collected packages: cpprb
Building wheel for cpprb (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-gd26vmem/cpprb/setup.py'"'"'; __file__='"'"'/tmp/pip-install-gd26vmem/cpprb/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-352_07nx --python-tag cp37
cwd: /tmp/pip-install-gd26vmem/cpprb/
Complete output (38 lines):
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.7
creating build/lib.linux-x86_64-3.7/cpprb
copying cpprb/__init__.py -> build/lib.linux-x86_64-3.7/cpprb
creating build/lib.linux-x86_64-3.7/cpprb/gym
copying cpprb/gym/__init__.py -> build/lib.linux-x86_64-3.7/cpprb/gym
copying cpprb/gym/Animation.py -> build/lib.linux-x86_64-3.7/cpprb/gym
running build_ext
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-gd26vmem/cpprb/setup.py", line 81, in <module>
This package requires C++17 compatible compiler to build.""")
File "/usr/local/lib/python3.7/site-packages/setuptools/__init__.py", line 145, in setup
return distutils.core.setup(**attrs)
File "/usr/local/lib/python3.7/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/local/lib/python3.7/distutils/dist.py", line 966, in run_commands
self.run_command(cmd)
File "/usr/local/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/usr/local/lib/python3.7/site-packages/wheel/bdist_wheel.py", line 192, in run
self.run_command('build')
File "/usr/local/lib/python3.7/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/usr/local/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/usr/local/lib/python3.7/distutils/command/build.py", line 135, in run
self.run_command(cmd_name)
File "/usr/local/lib/python3.7/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/usr/local/lib/python3.7/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/tmp/pip-install-gd26vmem/cpprb/setup.py", line 46, in run
import numpy as np
ModuleNotFoundError: No module named 'numpy'
----------------------------------------
ERROR: Failed building wheel for cpprb
Running setup.py clean for cpprb
Failed to build cpprb
Installing collected packages: numpy, cpprb
Running setup.py install for cpprb ... done
Successfully installed cpprb-8.0.1 numpy-1.17.3