【Python】venvを使った仮想環境の使いかた

Pythonに限らないとは思いますが、別々のプロジェクトごとにライブラリ等の依存ファイルが混同して環境が壊れないよう、それぞれ独立した開発環境(仮想環境)を作ることが推奨されています。
その方法はいくつかありますが、今回はPython3.3以降にvirtualenvが標準として組み込まれたvenvを使った方法についてまとめます。
また、

  • python3-devが無いというエラーが出てvenvで仮想環境を作れない(泣)
  • 作った仮想環境にpipでライブラリがインストールできない・・・(泣)

そんな場合の対処法についても記載しました。venvで環境構築できない(泣)という方の助けになればと思います!

環境

  • OS: Ubuntu16.04LTS/Ubuntu18.04LTS

Pythonの仮想環境いろいろ

Pythonで想環境を作るには、下記の通りいくつかあります。

それぞれの違いは別の機会に整理するとして、今回はvenvを使った方法について解説します。
※ 他の方法についてはそれぞれリンクを貼ってありますのでそちらをご参照ください。

(参考)公式リファレンス: venv — 仮想環境の作成

venvのインストール

venvはPythonの仮想環境作成のためにPython 3.3 から標準に組み込まれたモジュールです。標準組込みなので、新たにインストールは必要ありません。

仮想環境を作る

Pythonのバージョンを選ぶ

まず、どのバージョンのPythonで仮想環境を作るか決めます。
尚、自分の環境に入っているバージョンからしか選べないことに注意です。
※参考 自分のPythonのバージョンを確認する方法はこちら

  • 自分の環境に入っているバージョンで作る場合 → こちらへSkip
  • 自分の環境に入っていないバージョンで作る場合 → それをインストールしましょう
  • ちなみに、Ubuntu16.04LTSの公式?リポジトリではPython3.6以降はサポートしていないようでしたので(参考サイト)、Ubuntu16.04LTS+Python3.7で仮想環境を作る場合は新たにインストールが必要です。

(参考)自分の環境のPythonのバージョンを確認したい場合

python –versionコマンドで確認できます。

筆者の場合は、下記の通りBase環境でPython2.7、Python3でPython3.5を起動するようになっていました。

$ python --version
Python 2.7.12

$ python3 --version
Python 3.5.2

この他にも、例えばwhichコマンドで調べることも一つの手ですね。

$ which python3.5
/usr/bin/python3.5

仮想環境を作成する

例として、Python3.7ベースで、mydirというディレクトリにmyenvという名前の仮想環境を作ります。

  1. 事前準備(ディレクトリの準備)
  2. # mydirディレクトリを作成
      hibikisan@ubuntu:~$ mkdir mydir
    
      # カレントディレクトリを上記で作成したディレクトリに移動
      hibikisan@ubuntu:~$ cd mydir
      hibikisan@ubuntu:~/mydir$
  3. python3.7 -m venvコマンドを実行します。
  4. 無事に仮想環境が出来上がると、上記で設定した仮想環境の名前のディレクトリが生成されます。

    hibikisan@ubuntu:~/mydir$ python3.7 -m venv myenv
    
    # ディレクトリの中身を確認
    hibikisan@ubuntu:~/mydir$ ls -la
    合計 12
    drwxrwxr-x  3 hibikisan hibikisan 4096 10月 27 22:18 .
    drwxrwxr-x 21 hibikisan hibikisan 4096 10月 27 22:17 ..
    drwxrwxr-x  5 hibikisan hibikisan 4096 10月 27 22:18 myenv

ここでエラーメッセージが出てうまく仮想環境が作れなかった場合はこちらを参照ください。参考になるかもです。

構築した仮想環境に入る

下記コマンドで構築した仮想環境に入ることが出来ます。

hibikisan@ubuntu:~/mydir$ source myenv/bin/activate
(myenv) hibikisan@ubuntu:~/mydir$ 

Pythonのバージョンを確認すると、設定した通りPython3.7.4が立ち上がります。

* pythonのバージョンを確認。
(myenv) hibikisan@ubuntu:~/mydir$ python --version
Python 3.7.4

試しにライブラリがどんなものが入っているかpip freezeコマンドで見てみます。

(myenv) hibikisan@ubuntu:~/mydir$ pip freeze
(myenv) hibikisan@ubuntu:~/mydir$ 

新しく独立した環境を構築したので、当然ですが何も入っていません。試しにrequestsモジュールを入れてみます。

(myenv) hibikisan@ubuntu:~/mydir$ pip install requests
Collecting requests
  Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
     :
     :
  Successfully installed certifi-2019.9.11 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.6
You are using pip version 19.0.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

何やらpipが古いと言われてしまいましたが、ここは無視して、もう一度pip freezeでライブラリを見てみると、ちゃんと反映されてます。

(myenv) hibikisan@ubuntu:~/mydir$ pip freeze
certifi==2019.9.11
chardet==3.0.4
idna==2.8
requests==2.22.0
urllib3==1.25.6

あとは自分の開発に合わせてライブラリを入れていけばOKですね。

構築した仮想環境から出る

deactivateコマンドで仮想環境を抜けることが出来ます。

(myenv) hibikisan@ubuntu:~/mydir$ deactivate
hibikisan@ubuntu:~/mydir$ 

(参考)venvコマンドでエラーが発生した場合の対処法

venvコマンドで環境を作成する際に下記のようなエラーが出た場合の対処法です。

hibikisan@hibiki2019:~/projects$ python3.7 -m venv py37
  The virtual environment was not created successfully because ensurepip is not
  available.  On Debian/Ubuntu systems, you need to install the python3-venv
  package using the following command.
  
      apt-get install python3-venv
  
  You may need to use sudo with that command.  After installing the python3-venv
  package, recreate your virtual environment.
  
  Failing command: ['/home/hibikisan/projects/py37/bin/python3.7', '-Im', 'ensurepip', '--upgrade', '--default-pip']

まずは、言われたとおりにpython3-venvをインストールしてみましょう。

hibikisan@hibiki2019:~/projects$ sudo apt install python3-venv

インストール済なのにこのエラーメッセージが出る場合は下記のように–without-pipオプションを使うと出来ました。

hibikisan@hibiki2019:~/projects$ python3.7 -m venv --without-pip venv

# 仮想環境venvのフォルダが作成されたことが確認できます
hibikisan@hibiki2019:~/projects$ ls -la
total 12
drwxrwxr-x 3 hibikisan hibikisan 4096 Aug 29 00:01 .
drwxrwxr-x 4 hibikisan hibikisan 4096 Aug 28 23:58 ..
drwxrwxr-x 5 hibikisan hibikisan 4096 Aug 29 00:01 venv

但し、これだけだとpipが使えません
どういうことかというと、下記の通り仮想環境でのpythonのパスと、pipのパスが異なっています。pipはbase環境のパスとなっているので、この状態でpip installしてもbase環境に組み込まれてしまいます。

# pythonのパス
(py37) hibikisan@hibiki2019:~/projects$ which python
/home/hibikisan/projects/py37/bin/python

# pipのパス
(py37) hibikisan@hibiki2019:~/projects$ which pip
/home/hibikisan/.local/bin/pip

こういった場合は、下記の手順でpipを仮想環境のディレクトリにインストールします。

  1. get-pip.pyをダウンロード
  2. (py37) hibikisan@hibiki2019:~/projects$ curl -O https://bootstrap.pypa.io/get-pip.py
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                      Dload  Upload   Total   Spent    Left  Speed
    100 1733k  100 1733k    0     0  45.7M      0 --:--:-- --:--:-- --:--:-- 45.7M 
  3. get-pip.pyスクリプトを実行
  4. (py37) hibikisan@hibiki2019:~/projects$ python get-pip.py
    Collecting pip
        :
        :
    Installing collected packages: pip, setuptools, wheel
    Successfully installed pip-19.2.3 setuptools-41.2.0 wheel-0.33.6
  5. いったん仮想環境を抜けます
  6. (py37) hibikisan@hibiki2019:~/projects$ deactivate
  7. 再度仮想環境に入ります
  8. hibikisan@hibiki2019:~/projects$ source py37/bin/activate

pipのパスを確認。今度は仮想環境のパスになっています。

(py37) hibikisan@hibiki2019:~/projects$ which pip
/home/hibikisan/projects/py37/bin/pip

pip freezeでインストールされているライブラリを確認。まだ何も入れていないので、何も入っていません。

(py37) hibikisan@hibiki2019:~/projects$ pip freeze

試しにnumpyを入れてみます。

(py37) hibikisan@hibiki2019:~/projects$ pip install numpy
Collecting numpy
   :
   :
Installing collected packages: numpy
Successfully installed numpy-1.17.2

pipインストールしたライブラリを仮想環境内で無事使えることを確認しました。

(py37) hibikisan@hibiki2019:~/projects$ python
Python 3.7.3 (default, Apr  3 2019, 19:16:38) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy 
>>> numpy.__version__
'1.17.2'

まとめ

今回は、venvを使った仮想環境の構築および入り方・抜け方についてまとめました。また、エラーメッセージが出た時の対処法の一つも合わせて記載いました。同様のエラーで悩んでいる人の助けになればと思います!

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

[Sponsor link]