ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
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と競合が発生しているのが原因のようです。
確認すると確かに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-packages
をScripts
で置き換えます。 例えば、このコマンドはC:\Users\Username\AppData\Roaming\Python36\site-packages
のようなパスを返すので、C:\Users\Username\AppData\Roaming\Python36\Scripts
をPATH
に含める必要があります。 コントロールパネル でユーザー環境変数の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
コメントはありません。