☆☆ 新着記事 ☆☆

2018年12月22日土曜日

Pythonの仮想環境  venv と virtualenvのもっとも大きな違い

CentOS 7に標準についてくるPythonは、2.x系なので、当然、3.xのPythonを入れて、切り替えて使いたくなります。

CentOS 7についてくるPython 2.x は、OSに深く組み込まれているので、これをPython 3.xに入れ替えよう、などと夢見ては絶対にいけないらしいですし。


そこでPythonで仮想環境を作って、Pythonのバージョンを管理したいと考えるのですが、ネット検索すると、pyenv 、venv、virtualenvとか、仮想環境の色々な作り方がででてきます。


これから学習しようという自分にとって、pyenvは、deprecated(廃止予定)なので忘れて良いとして、


Python 3.6系以上で推奨されている 'venv' を使おうと思ったのですが、何度か失敗した後、再度、調べてみると、'venv' の仮想環境では、Python自身のバージョン管理(別のバージョンを使用するとか)はできないとのこと。


What is venv ?:
The venv module provides support for creating lightweight “virtual environments” with their own site directories, optionally isolated from system site directories. Each virtual environment has its own Python binary (which matches the version of the binary that was used to create this environment) and can have its own independent set of installed Python packages in its site directories

一方で、virtualenv は、Pythonのバージョン自身も管理できる。


これって大きな違いですよね。


この事をさらっと書いているか、どうもvirtualenvと混同(又は、混同されやすい表現)で書かれているサイトが多すぎ。。  


相当、時間を無駄にしてしまいました。



そこで、簡単にVirtualenvの動作を確認します。
環境はCentOS 7 + Python 2.7.5 (default)  + Python 3.6.8(別インストール済)です。


1. Virtualenvのインストール

 pipでインストールします。 pipがインストールされているか、違うバージョンのpythonが既に
 インストールされているときのpipの実行の仕方など、こちらにまとめていますので、参考に。
 【 Python PIP  良く使うコマンド一覧  】



 自分の環境は、既にPython3.6が入っているので、Pythonのバージョン指定(python3 -m)して、
 PIPを呼び出して実行。(インストール後のvirtualenvによる仮想環境は、このvirtualenvを
 インストールしたときのPythonのバージョンになりますので、とても大事。 ここでpython3と
 指定しなければ、defualtのpython2になります。)

 $  python3 -m pip install virtualenv 

   $ python3 -m  pip freeze <- グローバル環境にインストールされたpackageのリスト。
   Click==7.0
 Flask==1.0.2
 itsdangerous==1.1.0
 Jinja2==2.10
 MarkupSafe==1.1.0
 virtualenv==16.2.0
 Werkzeug==0.14.1

2.  Virtual Environmentを作成する為のディレクトリー作成。

  [ /]# cd var/www
  [www]# mkdir virtualpj
  [www]# cd virtualpj
  [virtualpj]# mkdir virtualpj_2
     [virtualpj]# virtualenv virtual_pj2
     Using base prefix '/usr/local'
     New python executable in /var/www/virtualpj/virtual_pj2/bin/python3
     Also creating executable in /var/www/virtualpj/virtual_pj2/bin/python
     Installing setuptools, pip, wheel...
     done.
* ここでは、virtualpjのフォルダを作成の上、移動し、さらにvirtualp2を作って、このフォルダに仮想化のパッケージを作っていますが、mkdir virtualpj の後に、単純にvirtualenv virtualpj でも良い。
フォルダを深くすることに意味はない。

     (確認)
  [virtualpj]# ll
  total 0
  drwxr-xr-x 5 root root 40 Jan  9 01:31 virtual_pj2
  [root@cnewgwb6 virtualpj]# cd virtual_pj2
  [root@cnewgwb6 virtual_pj2]# ls -a
  .  ..  bin  include  lib <- 次にこのbinをアクティベイトします。
   
3.  仮想環境のアクティベート

  [root@cnewgwb6 virtual_pj2]# cd ..
  [root@cnewgwb6 virtualpj]# source virtual_pj2/bin/activate
  (virtual_pj2) [root@cnewgwb6 virtualpj]# <- 仮想環境が作れました。
  (確認)
  (virtual_pj2) [root@cnewgwb6 virtualpj]# which python
  /var/www/virtualpj/virtual_pj2/bin/python
  (virtual_pj2) [root@cnewgwb6 virtualpj]# python -V
  Python 3.6.8 <- virtualenvをインストールしたときのPython環境に準拠します
  (virtual_pj2) [root@cnewgwb6 virtualpj]# pip freeze
  (virtual_pj2) [root@cnewgwb6 virtualpj]# <- インストールされたpackageはありません。









 これで、一応、環境が構築できました。 


以下は参考です。


【Virtualenv環境で実行したpip install は、仮想環境配下のbin/site-packageにインストールされる。】


(virtual_pj2) [root@cnewgwb6 virtualpj]# pip install numpy
Successfully installed numpy-1.15.4
(virtual_pj2) [root@cnewgwb6 virtualpj]# pip install pytz
Successfully installed pytz-2018.9
 (virtual_pj2) [root@cnewgwb6 virtualpj]# pip install psutil 
Successfully installed psutil-5.4.8
(virtual_pj2) [root@cnewgwb6 virtualpj]# pip list
Package    Version
---------- -------
numpy      1.15.4
pip        18.1
psutil     5.4.8
pytz       2018.9
setuptools 40.6.3
wheel      0.32.3
(virtual_pj2) [root@cnewgwb6 virtualpj]# pip freeze --local <-installされたパッケージをローカルだけに使うように設定。 
numpy==1.15.4
psutil==5.4.8
pytz==2018.9
(virtual_pj2) [root@cnewgwb6 virtualpj]# pip freeze --local > requirements.text 他にも、他のフォルダにExportするとかが可能。
(virtual_pj2) [root@cnewgwb6 virtualpj]# ls -a
.  ..  requirements.text  virtual_pj2
(virtual_pj2) [root@cnewgwb6 virtualpj]# cat requirements.text
numpy==1.15.4
psutil==5.4.8
pytz==2018.9
(virtual_pj2) [root@cnewgwb6 virtualpj]# deactivate
[root@cnewgwb6 virtualpj]#

◇ pythonのバージョンを別のものに指定して環境を作りたいとき。

[root@cnewgwb6 www]# which python2.7
/usr/bin/python2.7
[root@cnewgwb6 www]# virtualenv -p /usr/bin/python2.7 python27_env
[root@cnewgwb6 www]# ls -a
.  ..  cgi-bin  html  python27_env
[root@cnewgwb6 python27_env]# ls -a
.  ..  bin  include  lib  lib64

この仮想環境で、さきほどrequirements.textを利用して、必要なパッケージをインストールする事も可能。 例えば、先程のrequirements.textと全く同じパッケージを使って、別サーバーで環境構築したい場合など。


この時は、virtual environment対象のディレクトリーにrequirements.textをアップロードしてから、
以下のコマンドで実行する。

(virtual_pj) [root@cnewgwb6 virtualpj]#pip install  -r requirements.text


この 'requirements.text ' は、便利ですね。


virtualenv環境を終了するのは

(virtual_pj) [root@cnewgwb6 virtualpj]#deactivate



最後に、仮想環境virtualenvは、あくまでもパッケージなどのバージョン管理の為のものなので、プロジェクト・ファイルは、このvirtualenv環境内に作らないようにすべき、と言われているようです。


◇仮想環境のpip
仮想環境で呼び出されるpipの実体は、site-packagesの中にインストールされている。
後日、site-packagesを全部削除するようなことをすると(実際したが、、、)pipも削除されてしまう。

(tw_virtualenv) [root@ueczshc7 home]# pip -V
pip 19.1 from /home/tw_virtualenv/lib/python3.7/site-packages/pip (python 3.7)



以上です。

0 件のコメント:

コメントを投稿