ポイント
CentOS 7のPython 3.6において、ensurepipの問題で仮想環境(venv)がうまく入りませんでした。
仮想環境作成時に --without-pip
オプションを付けてまず仮想環境を作成し、続いてpipをインストールすることで無事に作成できました。
通常の手順でやってみる(失敗する)
$ mkdir virtual
$ python3 -mvenv virtual
Error: Command '['/home/user/virtual/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
私の環境が悪いのか、ensurepip周りでエラーが発生して仮想環境が構築されません。
ensurepipだけを読み込んでみるとsetuptoolsがないぞと言われます。
$ /home/user/virtual/bin/python3 -Im ensurepip
Traceback (most recent call last):
File "/usr/lib64/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib64/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/lib64/python3.6/ensurepip/__main__.py", line 5, in <module>
sys.exit(ensurepip._main())
File "/usr/lib64/python3.6/ensurepip/__init__.py", line 232, in _main
default_pip=args.default_pip,
File "/usr/lib64/python3.6/ensurepip/__init__.py", line 129, in _bootstrap
shutil.copy(whl, tmpdir)
File "/usr/lib64/python3.6/shutil.py", line 245, in copy
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/usr/lib64/python3.6/shutil.py", line 120, in copyfile
with open(src, 'rb') as fsrc:
FileNotFoundError: [Errno 2] No such file or directory: '/usr/lib64/python3.6/ensurepip/_bundled/setuptools-40.6.2-py2.py3-none-any.whl'
ensurepipに_bundled/setuptoolsのバージョンがハードコードされてるからそれを書き換えたらうまくいくよ!という記事があったのですが、そもそも /usr/lib64/python3.6/ensurepip/_bundled
ディレクトリが存在していない…。
仕方がないので、 pip
を入れずに構築し、その後で pip
をインストールするという作戦を試みました。
pipを後からインストール
$ mkdir virtual
$ python3 -mvenv virtual --without-pip
$ . virtual/bin/activate
(virtual)$ curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
(virtual)$ python3 get-pip.py
これで無事にインストールできました。
おまけ
普段からきっちりvenvしてなかった私が悪いのですが、.localにいろいろパッケージが入ってしまっていて、それが悪さをして困ったことが起こります。特にGoogle APIはなかなかのツワモノで、.localと干渉してインストールできない、できても動かない、という感じでハマります。
私の環境ではvenvをactivateしてもうまくいかないケース(もう環境がぐちゃぐちゃなのかも)がありましたが、その場合はactivateして、さらに仮想環境のpip3を指定することで無事に動きました。
$ . virtual/bin/activate
(virtual)$ ./virtual/bin/pip3 install google-api-python-client google-auth-oauthlib