PipenvによるWindows上でのPython仮想環境の構築について

最近、Pythonの勉強を始めたのですが、パッケージをインストールすることに対して抵抗があり、できる限り環境を汚さない方法がないかなぁと調べていたら、仮想環境を使えばそれが実現できそうなことがわかりました。

そこで、今回はPipenvを使用してプロジェクトディレクトリ単位に仮想環境を構築して、別プロジェクトのパッケージと干渉させない方法について説明したいと思います。

環境

  • Windows10 Home バージョン2004(OS ビルド 19041.421)
  • python 3.8.5

Pythonのインストール

Microsoft StoreからPythonをインストールします。

https://www.microsoft.com/ja-jp/p/python-38/9mssztt1n39l?activetab=pivot:overviewtab

※2020年8月時点ではバージョン3.8が最新です

インストール後にPowerShellを立ち上げて、次のコマンドを実行します。

PS > python --version
Python 3.8.5

Pythonのバージョンが表示されたら、インストールは成功です。

pipのアップグレード

pipのバージョンが古いと、pip使用時に次のようなエラーメッセージが表示されるため、pipを最新にアップグレードします。

WARNING: You are using pip version 20.1.1; however, version 20.2.1 is available.

You should consider upgrading via the 'C:\Users\ユーザ名\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\python.exe -m pip install --upgrade pip' command.

指示どおりにコマンドを実行します。

PS > python -m pip install --upgrade pip

アップグレード後にpipのバージョンが上がっていることを確認します。

PS > pip --version
pip 20.2.1 from C:\Users\ユーザ名\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\pip (python 3.8)

Pipenvのインストール

次のコマンドを実行してPipenvをインストールします。

PS > pip install --user pipenv

この後、インストールが無事行われたかを確認するために、バージョンを確認すると、、、

PS > pipenv --version
pipenv : 用語 'pipenv' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合は
そのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ pipenv
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (pipenv:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

pipenvにパスが通っていないようです。

調べたところ、インストール済みのvirtualenvと競合が発生しているのが原因のようです。

https://stackoverflow.com/questions/46041719/windows-reports-error-when-trying-to-install-package-using-pipenv

確認すると確かにvirtualenvがインストールされています。

PS > pip list
Package          Version
---------------- ---------
appdirs          1.4.4
certifi          2020.6.20
distlib          0.3.1
filelock         3.0.12
pip              20.2.1
pipenv           2020.6.2 ← 一応pipenvはインストールされている。パスが通っていないだけ?
six              1.15.0
virtualenv       20.0.30 ← これとpipenvが競合している?
virtualenv-clone 0.5.4

Stack Overflowに従って、virtualenvとpipenvをアンインストールしてから、pipenvを入れ直します。

PS > pip uninstall virtualenv
・・・
Proceed (y/n)? y ← yと入力
・・・
PS > pip uninstall pipenv
・・・
Proceed (y/n)? y ← yと入力
・・・
PS > pip install --user pipenv

( ´_ゝ`)よし、これで問題なくなったはず。もう一度実行して、、、

PS > pipenv --version
pipenv : 用語 'pipenv' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されま
せん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく
ださい。
発生場所 行:1 文字:1
+ pipenv --version
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (pipenv:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

( ´_ゝ`)・・・カナシイ

実はStack Overflowをよく読むと、環境変数Pathにパスを追加しろと言っている人がいて、Pipenvの公式サイトにも同じような記載があります。

https://pipenv-ja.readthedocs.io/ja/translate-ja/install.html#installing-pipenv

Windows では python -m site --user-site を実行してユーザーのベースバイナリディレクトリを見付け、 site-packagesScripts で置き換えます。 例えば、このコマンドは C:\Users\Username\AppData\Roaming\Python36\site-packages のようなパスを返すので、 C:\Users\Username\AppData\Roaming\Python36\ScriptsPATH に含める必要があります。 コントロールパネル でユーザー環境変数の PATH に設定すると再起動しても消えません。 PATH の変更を有効にするには一度ログアウトする必要があるかもしれません。

公式サイトのとおり、次のコマンド結果であるディレクトリパスの「site-packages」を「Scripts」に置き換えたものを、コントロールパネルからユーザー環境変数Pathに追加します。

PS > python -m site --user-site
C:\Users\ユーザ名\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages

環境変数Pathにパスを追加した後に、PowerShellをもう一度起動して、pipenvコマンドが実行できることを確認します。

PS > pipenv --version
pipenv, version 2020.6.2

もしかしたらMicrosoft StoreではなくPython.orgからPythonをインストールしたら、Pathがきちんと設定されていたのかもしれません。。。

Pipenvの環境変数設定

公式サイトより

PIPENV_VENV_IN_PROJECT

If set, creates .venv in your project directory.

Default is to create new virtual environments in a global location.

仮想環境はデフォルトだとグローバル領域に作られるらしく、環境変数「PIPENV_VENV_IN_PROJECT」を定義すればプロジェクトディレクトリの配下に仮想環境が作られるようになります。

プロジェクトディレクトリ=仮想環境としたほうが管理しやすいので、コントロールパネルからユーザー環境変数PIPENV_VENV_IN_PROJECT(値はtrue)を追加します。

環境変数に追加したら、PowerShellをもう一度起動して次のコマンドを実行します。

PS > Get-ChildItem env:PIPENV_VENV_IN_PROJECT

Name                           Value
----                           -----
PIPENV_VENV_IN_PROJECT         true

PIPENV_VENV_IN_PROJECTが表示されたら、設定は問題ありません。

仮想環境の作成

プロジェクト用のディレクトリ(pipenv_test)を作成して、その中に移動します。

PS > mkdir -p C:\python\pipenv_test
PS > cd C:\python\pipenv_test

次のコマンドで仮想環境を作成します。

PS > pipenv install

仮想環境作成後は、pipenv_testディレクトリの中にPipfileとPipfile.lockが作成されます。

Pipfile

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.8"

Pipfile.lock

{
    "_meta": {
        "hash": {
            "sha256": "7f7606f08e0544d8d012ef4d097dabdd6df6843a28793eb6551245d4b2db4242"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.8"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {},
    "develop": {}
}

PipfileとPipfile.lockは、PHPで言うとcomposer.jsonとcomposer.lockに相当するファイルで、インストールされたパッケージやその依存関係などが記述されています。これを他の環境に持っていき、pipenv syncコマンドを実行すると全く同じ環境を構築できます。

パッケージのインストール

例えば、pygameをインストールする場合は次のコマンドを実行します。

PS > pipenv install pygame

コマンド実行後は、PipfileとPipfile.lockが更新されているのがわかると思います。

仮想環境にインストールされているパッケージをコマンドで確認する場合は、次のどちらかを実行します。

PS > pipenv shell # 仮想環境のシェルを起動する
PS > pip list
※仮想環境のシェルを抜けるときはexit

または

PS > pipenv run pip list # 仮想環境の中で「pip list」を実行する

↓↓↓

Package    Version
---------- -------
pip        20.2.1
pygame     1.9.6
setuptools 49.2.1
wheel      0.34.2

スクリプトの実行

次の内容でmain.pyをpipenv_testディレクトリの中に作成します。

import pygame
import sys

def main():
    pygame.init()
    surface = pygame.display.set_mode((640, 480))
    pygame.display.set_caption("main.py")

    while True:
        surface.fill((255, 255, 255))
        pygame.display.update()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    main()

次のどちらかのコマンドによりmain.pyを実行すると、ウィンドウが立ち上がります。

PS > pipenv shell
PS > python main.py

もしくは

PS > pipenv run python main.py

Kitaru

Programmer

PipenvによるWindows上でのPython仮想環境の構築について

お気軽に
お問い合わせください。

お問い合わせ