naritoブログ

【お知らせ】
新ブログができました。今後そちらで更新し、このサイトは更新されません(ウェブサイト自体は残しておきます)
このブログの内容に関してコメントしたい場合は、新ブログのフリースペースに書き込んでください

このブログの内容を新ブログに移行中です。このブログで見つからない記事は、新ブログにありま

Python、venvで仮想環境を作る

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

お知らせ


現在は、Pipenvというもう少し洗練されたものがあります。


venvの使い方



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



公式ドキュメント

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

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

python -m venv testvenv


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

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

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

Scripts\activate


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

deactivate


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

もしPython3.5で仮想環境を作りたいならば、例えば以下のように、
私はc:直下に各バージョンのPythonをインストールしています。なので、c:\python35\python がそのパスになります。

c:\\python35\\python -m venv testvenv35


この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/