Pythonのvenvとpipまとめ|仮想環境の作成・一括更新・cron実行
/ 7 min read
Table of Contents
はじめに
Pythonでいくつもプロジェクトを触っていると、ライブラリのバージョン違いが必ず問題になります。仮想環境を分けておけば、プロジェクトごとに独立したライブラリ構成を保てます。
この記事では、標準の venv と pip の使い方を、環境構築から定期実行まで一通りまとめました。
venvで仮想環境を作る
Ubuntu
# venvのインストール$ sudo apt install python3-venv
# 仮想環境の作成$ python3 -m venv 仮想環境名
# 仮想環境に入る$ . 仮想環境名/bin/activate
# 仮想環境から抜ける$ deactivateWindows
# 仮想環境の作成$ py -m venv 仮想環境名
# 仮想環境に入る(コマンドプロンプト)$ 仮想環境名\Scripts\activate.bat
# 仮想環境に入る(PowerShell)$ 仮想環境名\Scripts\Activate.ps1
# 仮想環境から抜ける$ deactivateパスの区切りがバックスラッシュである点に注意してください。
複数のPythonバージョンを使い分ける(Windows)
# インストールされているバージョンの確認$ py --list-paths
# バージョンを指定して仮想環境を作成$ py -3.12 -m venv 仮想環境名Ubuntuの場合は実行するPython自体を切り替えます。
$ python3.12 -m venv 仮想環境名pipの基本コマンド
# 依存関係に矛盾がないか確認$ pip check
# アップデート可能なパッケージの一覧$ pip list -o
# パッケージのアップデート$ pip install -U パッケージ名
# パッケージのアンインストール$ pip uninstall パッケージ名
# インストール済みパッケージをファイルに出力$ pip freeze > requirements.txt
# requirements.txt からまとめてインストール$ pip install -r requirements.txtpip freeze と pip install -r の組み合わせが、環境を別のマシンで再現するときの基本形です。
パッケージを一括でアップデートする
pipには一括アップデートのコマンドが標準で用意されていないため、少し工夫が要ります。どの方法を使うにせよ、先にバックアップを取っておいてください。
$ pip freeze > requirements_before_update.txtpip-review を使う(Ubuntu・Windows共通)
いちばん手軽なのはこの方法です。
# インストール$ pip install pip-review
# アップデート可能なものを確認(pip list -o とほぼ同じ)$ pip-review
# 自動で全部アップデート$ pip-review --autoPowerShellのワンライナー(Windows)
追加のライブラリを入れたくない場合は、PowerShellだけで完結させられます。
$ pip install --upgrade ((pip freeze) -replace '==.+','')やっていることは単純です。
pip freezeでパッケージ一覧を取得する(例:numpy==1.24.0)-replace '==.+',''でバージョン指定を削る(例:numpy)pip install --upgradeに渡して全部更新する
終わったら requirements.txt を更新しておきます。
$ pip freeze > requirements.txt仮想環境のPythonをスクリプトから実行する
シェルスクリプトから仮想環境のPythonを動かす場合、**activate は必要ありません。**仮想環境内のPythonバイナリを絶対パスで直接呼べば、そのまま仮想環境のライブラリが使われます。
#!/bin/bashset -e
cd /home/ubuntu/app/home/ubuntu/app/venv/bin/python main.pyactivate を使う書き方も動きますが、行数が増えるうえに deactivate の書き忘れが起きやすくなります。
#!/bin/bashset -e
cd /home/ubuntu/app. venv/bin/activatepython main.pydeactivatecronから仮想環境のPythonを実行する
定期実行も同じ考え方です。仮想環境のPythonを絶対パスで指定します。
$ crontab -e# 毎日16時33分に実行33 16 * * * cd /home/ubuntu/app; /home/ubuntu/app/venv/bin/python main.py >> /tmp/cron.log 2>&1末尾の >> /tmp/cron.log 2>&1 は、標準出力とエラー出力の両方をログファイルに追記する指定です。cronは失敗しても何も教えてくれないので、ログは必ず出しておいてください。
うまく動かないときは、まず次のコマンドで実行ログを確認します。
$ grep CRON /var/log/syslogおわりに
仮想環境まわりは、一度手順を固めてしまえば毎回同じ流れで済みます。特にcronの実行では「activate は要らない、絶対パスでPythonを直接呼ぶ」という一点を押さえておくと、動かない原因のほとんどを避けられます。
