naritoブログ

このブログはDjangoとBootstrap4で作成されました
ソースコード

Python、venvで仮想環境を作る

プログラミング関連 venv Python 約200日前
2017年4月3日10:41


venv モジュールは、軽量な “仮想環境” の作成のサポートを提供します。仮想環境には、仮想環境ごとの site ディレクトリがあり、これはシステムの site ディレクトリから分離させることができます。それぞれの仮想環境には、それ自身の Python バイナリ (様々な Python バージョンで環境を作成できます) があり、仮想環境ごとの site ディレクトリに独立した Python パッケージ群をインストールできます。



https://docs.python.jp/3/library/venv.html

現在は、仮想環境を作りたいならばこのvenvを使っておけば間違いないです。
2系では、virtualenvを使いましょう。

まずはWindowsです。
これは「testvenv」という名前で仮想環境が作成されます。
「pyvenv」が以前使えましたが、現在は以下のように使う事が推奨されています。
python -m venv testvenv


testvenvディレクトリが作成され、中を覗くと色々作られています。


Scriptsの中をのぞくと、色々あります。
上で入力したpythonコマンドは、私の環境ではc:\python36\python のことを指します。そのpython36ディレクトリから、python.exe等のPythonを実行するのに必要なファイルを持ってきている訳です。


Scriptsのあるディレクトリに移動し、以下のようにコマンドを打つと仮想環境がアクティブになります。
Scripts\activate


やめたいときは、deactivate です。
deactivate


左側に(testvenv)と、現在アクティブになっている仮想環境名が表示されます。
pip freezeでインストールしたパッケージを表示しても、ちゃんと空欄ですね。
後は心おきなく、好きなバージョンの物をインストールしていくだけです。


このactivateでやっているのは、案外単純です。環境変数PATHを見てみましょう。
まずはactivateしていない版
C:\MyMercurial\test\testpython\testvenv>echo %PATH%
C:\Program Files (x86)\NVIDIA......


activateした版。venvのscriptsディレクトリのパスが最初に入ってますね。
さっき見たscriptsディレクトリにはpythonやらpipやら色々入っていました。仮想環境がonならば、pythonやpipコマンドはこの仮想環境に入っている物を使用する訳です。
C:\MyMercurial\test\testpython\testvenv>scripts\activate
(testvenv) C:\MyMercurial\test\testpython\testvenv>echo %PATH%
C:\MyMercurial\test\testpython\testvenv\Scripts;C:\Program Files (x86)\NVIDIA....


sysモジュールのexecutableは、Python インタプリタの実行ファイルの絶対パス返します。
これで見てみると、確かにtestvenv\scripts\python を指しています。
(testvenv) C:\MyMercurial\test\testpython\testvenv>python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\\MyMercurial\\test\\testpython\\testvenv\\Scripts\\python.exe'


なので、このような使い方も可能です。activateせず、フルパスでvenv内のpythonを指定します。
C:\\MyMercurial\\test\\testpython\\testvenv\\Scripts\\python test.py


pipもちゃんとできてますね。
C:\MyMercurial\test\testpython\testvenv>C:\\MyMercurial\\test\\testpython\\testvenv\\Scripts\\python -m pip install requests
Collecting requests
  Using cached requests-2.13.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.13.0

C:\MyMercurial\test\testpython\testvenv>scripts\activate
(testvenv) C:\MyMercurial\test\testpython\testvenv>pip freeze
requests==2.13.0


Unix系のOSでも、大体は同じです。まずは仮想環境の作成...
python3.6 -m venv linuxvenv


さっきのScriptsディレクトリが、今度はbinになった感じです。
仮想環境のONは、source bin/activate とコマンドを打ちます。
cd linuxvenv
source bin/activate



ls bin

# 結果
activate      activate.fish  easy_install-3.6  pip3    python   python3.6
activate.csh  easy_install   pip               pip3.6  python3


which pythonをすると、ちゃんと仮想環境内のpythonを指しています。
which python

# 結果
/home/linuxvenv/bin/python


deactivateをすると、ちゃんと元に戻りますね。
deactivate
which python

# 結果
/usr/bin/python



例えば、mod_wsgiでDjangoを、venvで動かしたい、なんて場合は以下のようになります。
venvのパスは、「/home/linuxvenv」、
Djangoプロジェクトのパスが「/home/linuxvenv/aiueo」
<VirtualHost *:80>
    ServerName domain.com

    WSGIDaemonProcess domain.com python-home=/home/linuxvenv python-path=/home/linuxvenv/aiueo
    WSGIProcessGroup domain.com
    WSGIScriptAlias / /home/linuxvenv/aiueo/aiueo/wsgi.py

    <Directory /home/linuxvenv/aiueo/aiueo>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>


venvでgunicornをpipし、それを使ってDjangoを動かしたい、なんて場合は以下のようなserviceを作ることになるでしょう。
/home/testvenv/bin/gunicornが、仮想環境でpipしたgunicornです。
[Unit]
Description=gunicorn
After=network.target
 
[Service]
WorkingDirectory=/home/testvenv/testdjango
ExecStart=/home/testvenv/bin/gunicorn --bind 127.0.0.1:8000 testdjango.wsgi:application
 
[Install]
WantedBy=multi-user.target


http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/