skip to content
barorin&

Pythonのvenvとpipまとめ|仮想環境の作成・一括更新・cron実行

/ 7 min read

Table of Contents

はじめに

Pythonでいくつもプロジェクトを触っていると、ライブラリのバージョン違いが必ず問題になります。仮想環境を分けておけば、プロジェクトごとに独立したライブラリ構成を保てます。

この記事では、標準の venvpip の使い方を、環境構築から定期実行まで一通りまとめました。

venvで仮想環境を作る

Ubuntu

Terminal window
# venvのインストール
$ sudo apt install python3-venv
# 仮想環境の作成
$ python3 -m venv 仮想環境名
# 仮想環境に入る
$ . 仮想環境名/bin/activate
# 仮想環境から抜ける
$ deactivate

Windows

Terminal window
# 仮想環境の作成
$ py -m venv 仮想環境名
# 仮想環境に入る(コマンドプロンプト)
$ 仮想環境名\Scripts\activate.bat
# 仮想環境に入る(PowerShell)
$ 仮想環境名\Scripts\Activate.ps1
# 仮想環境から抜ける
$ deactivate

パスの区切りがバックスラッシュである点に注意してください。

複数のPythonバージョンを使い分ける(Windows)

Terminal window
# インストールされているバージョンの確認
$ py --list-paths
# バージョンを指定して仮想環境を作成
$ py -3.12 -m venv 仮想環境名

Ubuntuの場合は実行するPython自体を切り替えます。

Terminal window
$ python3.12 -m venv 仮想環境名

pipの基本コマンド

Terminal window
# 依存関係に矛盾がないか確認
$ pip check
# アップデート可能なパッケージの一覧
$ pip list -o
# パッケージのアップデート
$ pip install -U パッケージ名
# パッケージのアンインストール
$ pip uninstall パッケージ名
# インストール済みパッケージをファイルに出力
$ pip freeze > requirements.txt
# requirements.txt からまとめてインストール
$ pip install -r requirements.txt

pip freezepip install -r の組み合わせが、環境を別のマシンで再現するときの基本形です。

パッケージを一括でアップデートする

pipには一括アップデートのコマンドが標準で用意されていないため、少し工夫が要ります。どの方法を使うにせよ、先にバックアップを取っておいてください。

Terminal window
$ pip freeze > requirements_before_update.txt

pip-review を使う(Ubuntu・Windows共通)

いちばん手軽なのはこの方法です。

Terminal window
# インストール
$ pip install pip-review
# アップデート可能なものを確認(pip list -o とほぼ同じ)
$ pip-review
# 自動で全部アップデート
$ pip-review --auto

PowerShellのワンライナー(Windows)

追加のライブラリを入れたくない場合は、PowerShellだけで完結させられます。

Terminal window
$ pip install --upgrade ((pip freeze) -replace '==.+','')

やっていることは単純です。

  • pip freeze でパッケージ一覧を取得する(例: numpy==1.24.0
  • -replace '==.+','' でバージョン指定を削る(例: numpy
  • pip install --upgrade に渡して全部更新する

終わったら requirements.txt を更新しておきます。

Terminal window
$ pip freeze > requirements.txt

仮想環境のPythonをスクリプトから実行する

シェルスクリプトから仮想環境のPythonを動かす場合、**activate は必要ありません。**仮想環境内のPythonバイナリを絶対パスで直接呼べば、そのまま仮想環境のライブラリが使われます。

#!/bin/bash
set -e
cd /home/ubuntu/app
/home/ubuntu/app/venv/bin/python main.py

activate を使う書き方も動きますが、行数が増えるうえに deactivate の書き忘れが起きやすくなります。

#!/bin/bash
set -e
cd /home/ubuntu/app
. venv/bin/activate
python main.py
deactivate

cronから仮想環境のPythonを実行する

定期実行も同じ考え方です。仮想環境のPythonを絶対パスで指定します。

Terminal window
$ crontab -e
Terminal window
# 毎日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は失敗しても何も教えてくれないので、ログは必ず出しておいてください。

うまく動かないときは、まず次のコマンドで実行ログを確認します。

Terminal window
$ grep CRON /var/log/syslog

おわりに

仮想環境まわりは、一度手順を固めてしまえば毎回同じ流れで済みます。特にcronの実行では「activate は要らない、絶対パスでPythonを直接呼ぶ」という一点を押さえておくと、動かない原因のほとんどを避けられます。

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で実際に使っているコードや、Ubuntu・Raspberry Piの設定メモを書いています。