.. -*- coding: utf-8 -*-
.. index:: venv
.. _venv-section:
=====================================
サードパーティ製パッケージと venv
=====================================
:節サブタイトル: 隔離されたPythonの実行環境で便利なサードパーティ製パッケージを利用する。
本節では、Pythonをより便利にするサードパーティ製パッケージのインストール方法と、環境を壊さずにインストールするための venv モジュールの使い方を説明します。
.. index:: PyPI
サードパーティ製パッケージ
==========================
Python は標準ライブラリだけでもいろいろなことができますが、さらに便利なサードパーティ製のパッケージも提供されています。
サードパーティ製パッケージは `PyPI `_ (the Python Package Index、パイピーアイと読む)というサイトで情報が共有されています。
.. figure:: images/pypi.png
:width: 600
:alt: PyPI - the Python Package Index
PyPI - the Python Package Index
.. index:: pip
pipコマンド
-----------
サードパーティ製パッケージをインストールするには、 **pipコマンド** を使用します。
.. index:: ensurepip
single: pip; ensurepip
Python 3.4から ``ensurepip`` という仕組みによって、Pythonのインストール時にpipコマンドがインストールされます。
pipもpipコマンドでアップグレードを行えます。まずは、現在イントールされているpipコマンドを最新にアップグレードしましょう。
アップグレードは、次のコマンドを実行します。
.. code-block:: sh
:caption: pipをアップグレード
$ pip install pip --upgrade
**以下はpipコマンドのサンプルです** ここでは実行しないで、以下のvenv環境を作ってから実行しましょう。
pip コマンドを利用すると以下の様なコマンドで簡単にサードパーティ製パッケージをインストールできます。
.. index:: requests
single: pip; requests
.. code-block:: sh
:caption: pipコマンドでrequestsをインストール
$ pip install requests
次に、独立したPython環境を構築する **venv** モジュールについて説明します。
.. admonition:: コラム: Windows環境でpip実行時にエラーになる場合
PATH環境変数を確認し、Python3 をインストールしているPATHが設定されているかどうか確認してみてください。
.. index:: venv
single: venv; Virtual Environments
.. _about-venv:
venvとは
==========
複数のプロジェクトで異なるサードパーティ製パッケージを利用することはよくあります。その場合、プロジェクトごとにインストールするパッケージを切り替えられると便利です。
venvはプロジェクトごとに隔離されたPythonの仮想環境(Virtual Environments)を作成します。
.. index:: pyvenv
.. note:: pyvenvスクリプトの廃止について
以前は pyvenvスクリプトを利用したPython実行環境の作成方法を紹介していました。
ですが、Python 3.6 から pyvenvスクリプトが非推奨となり将来的に削除されるので一部説明を変更をいたしました。
今後は「python -m venv」を利用するようにしてください。
pyvenvスクリプトが廃止になった経緯は下記URLを参照してください。
https://docs.python.org/ja/3/whatsnew/3.6.html#id8
.. admonition:: コラム: condaの場合
`Anaconda `_ を使っている場合は **pip** 、 **venv** の代わりに `Conda `_ というパッケージ管理ツールを使用します。
condaではそれぞれ以下のコマンドで、サードパーティー製パッケージのインストール、環境の作成、有効化、無効化が行えます。
.. code-block:: sh
:caption: conda コマンドの例
$ conda create --name env python # 環境を作成
$ source activate env # 環境の有効化
(env) $ conda install requests # パッケージのインストール
(env) $ source deactivate # 環境の無効化
venv環境の作成
--------------
venv環境を作成します。
作成には ``venv`` モジュールを使用します。引数には作成する環境の名前を指定します。
.. _venv-create-linux-or-mac:
.. code-block:: sh
:caption: venv環境の作成(macOS、Linux)
$ python3 -m venv env
$ ls
env/
Windowsの場合はスクリプトの実行権限を与えます(`Set-ExecutionPolicy RemoteSigned -Scope CurrentUser` )。このコマンドは一度実行したら、再び実行する必要はありません。
.. code-block:: sh
:caption: venv環境の作成(Windows)
> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
> python -m venv env
> ls
env/
現在のフォルダに、envというディレクトリが作成されます。
venv環境の有効化
----------------
作成した ``venv`` 環境を有効化(activate)します。
.. index:: source
.. index:: activate
そのためにはbashスクリプトの ``env/bin/activate`` を ``source`` コマンドで実行します(:numref:`venv-activate-linux-or-mac` )。
Windowsの場合はスクリプトを実行します( :numref:`venv-activate-windows` )。
.. _venv-activate-linux-or-mac:
.. code-block:: sh
:caption: venv環境の有効化(macOS、Linux)
$ source env/bin/activate
(env) $
.. _venv-activate-windows:
.. code-block:: sh
:caption: venv環境の有効化(Windows)
> env\Scripts\Activate.ps1
(env) >
``venv`` 環境を有効化すると、プロンプトの前に環境名(ここでは ``env`` )が表示されます。そして、環境変数 ``PATH`` の先頭にenv/binが追加され、 ``venv`` 環境のPythonが実行されるようになります。
ここでは、 ``pip`` コマンドで ``requests`` (HTTPクライアントのパッケージ)をインストールします(:numref:`venv-install-requests`)。
.. _venv-install-requests:
.. code-block:: sh
:caption: パッケージのインストール
(env) $ pip install requests
(env) $ python
>>> import requests
>>> # requestsがインポートできる
``requests`` が ``env/lib/python3.10/site-packages`` 配下にインストールされます。
またPythonパッケージの中にはコマンドとして実行可能なファイルが含まれている場合があります。それらのファイルは ``env/bin`` 配下にインストールされます。
.. index:: deactivate
venv環境の無効化
----------------
``venv`` 環境を無効化(deactivate)するには、 ``deactivate`` コマンドを実行します(:numref:`venv-deactivate`)。
無効化した後、元の環境で ``requests`` をインポートするとエラーとなり、 ``venv`` 環境でのみ ``requests`` がインストールされていることがわかります。
.. _venv-deactivate:
.. code-block:: sh
:caption: venv環境を無効化
(env) $ deactivate
$
$ python
>>> import requests
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named requests
>>> # エラーが出力される
.. index:: freeze
single: pip; freeze
single: pip; requirements.txt
.. admonition:: コラム: 仮想環境の共有(pip freezeとrequirements.txt)
venvで仮想環境を作成できることの必要性はわかってもらえたと思います。
あるプロジェクトを複数人で開発する場合に、インストールしているパッケージ情報はどのように共有するのでしょうか?
pipにはそのための機能があります。
``pip freeze`` コマンドを実行すると、インストールしたパッケージの一覧が出力されます。
この情報をファイルに保存して、プログラムのソースコードと一緒にバージョン管理します。
ファイル名としては **requirements.txt** がよく知られている名前なので、他の人にパッケージの一覧が入っているという意図が伝わりやすいです。
.. code-block:: sh
:caption: pip freeze コマンドでパッケージの情報を書き出す
(env) $ pip install requests
(env) $ pip freeze > requirements.txt
(env) $ cat requirements.txt
certifi==2017.4.17
chardet==3.0.4
idna==2.5
requests==2.18.1
urllib3==1.21.1
プロジェクトの他のメンバーは、ソースコードをダウンロードした後、以下の手順で仮想環境に同じパッケージをインストールします。
.. code-block:: sh
:caption: pip install で同じ環境を作る
$ git clone some-project-source-code
$ cd some-project
$ python3 -m venv env # Windowsの場合は python -m venv env
$ source env/bin/activate
(env) $ pip install -r requirements.txt
Collecting certifi==2017.4.17 (from -r hoge.txt (line 1))
Using cached certifi-2017.4.17-py2.py3-none-any.whl
(中略)
Installing collected packages: certifi, chardet, idna, urllib3, requests
Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.18.1 urllib3-1.21.1
(env) $
このようにして、同一の環境をプロジェクトメンバー全体で共有します。
.. index:: conda
まとめ
=======
本節では、以下について説明しました。
- 便利なサードパーティ製パッケージのサイト **PyPI**
- パッケージをインストールする **pipコマンド**
- プロジェクトごとに隔離したPython環境を、 **venvモジュール** を使って作成、有効化、無効化する方法
次節では、venv環境にパッケージをインストールして、スクレイピングを行う方法を説明します。