ウェブサイト検索

LinuxでPythonパッケージを仮想環境間で移行する


Pythonのパッケージをある仮想環境から別の仮想環境に移動するのは非常に簡単です。このガイドでは、Linuxで仮想環境間でPythonパッケージを移行する方法を正確にお見せします。

このガイドでは、次のことを説明します。

  • 古い仮想環境からパッケージをエクスポートする方法、
  • 新しい環境を作成するためのステップバイステップの手順
  • 新しい環境にすべてのパッケージをインストールする方法
  • 一般的な問題とその解決方法
  • Python環境を管理するためのベストプラクティス
  • そしていくつかのよくある質問とその答え。

さあ、始めましょう!

バーチャル環境とは何ですか?

仮想環境を、各Pythonプロジェクトのための別々の作業スペースと考えてください。これにより、プロジェクトを整理整頓された状態に保つことができます。各環境には独自のパッケージセットがあります。

複数のプロジェクトで作業する際には、仮想環境が重要です。例えば、2つのプロジェクトがあるとします。1つはPython 3.11を使用し、もう1つはPython 3.12が必要です。

仮想環境がなければ、両方のバージョンを同時に使うことはできません。同じパッケージの異なるバージョンをグローバルなPython環境にインストールすると、2回目のインストールが1回目を上書きします。

仮想環境は、すべてを分けて管理することでこの問題を解決します。これにより、複数のプロジェクトを問題なく進めることができます。

パッケージを移行すべき時はいつですか?

次の場合にパッケージを移動する必要があるかもしれません:

  • 新たに始める: 古いものが散らかった状態のない、きれいな環境を望んでいます
  • 環境の破損: 現在の環境が損傷したり、乱れたりしました
  • Pythonのアップグレード:新しいPythonのバージョンに移行しています
  • 新しいコンピューターのセットアップ:別のマシンでセットアップを複製する必要があります
  • ツールの切り替え: あなたは一つのパッケージマネージャーから別のものに変更しています

仮想環境は一時的なものと考えるべきです。もしそれらが破損したり、あまりにも雑然としてしまった場合は、修復するよりも削除して作り直す方が簡単なことが多いです。

Pythonパッケージをある仮想環境から別の仮想環境に移行するステップバイステップガイド

仮想環境はPythonの依存関係をプロジェクトごとに分離して保持します。インストール済みのすべてのパッケージを、わずか2つの簡単なステップで別の環境にコピーできます:

  1. pip freeze を使ってパッケージリストをエクスポートする
  2. 新しい環境に pip install -r requirements.txt を使ってインストールします

このガイドのデモンストレーション目的のために、私は2つの仮想環境、すなわちMypyenv(現在の環境)とPyenv(新しい環境)を使用します。MypyenvからPyenvへすべてをわずか9つの簡単なステップで移行する方法を見てみましょう。

まず、インストールされているものの一覧を保存します。次に、その一覧を使って新しい環境にすべてをインストールします。

ステップ1:現在の仮想環境をアクティブにする

ターミナルを開き、コピーしたい現在の(古い)環境をアクティブにします。私の場合は Mypyenv です。

仮想環境を有効にするには、次のコマンドを実行してください:

source Mypyenv/bin/activate

実際の環境パスに ~/Mypyenv を置き換えてください。

プロンプトに「(Mypyenv)」と表示されます。これはそれがアクティブであることを示しています。

(Mypyenv) ostechnix@pvedebian:~$ 

Pythonの仮想環境を有効化する

ステップ2:要件ファイルを作成する

さて、インストールされているすべてのパッケージをファイルに保存します。このファイルには、すべてのパッケージとそのバージョン番号が一覧表示されます。

これを行うには、次のコマンドを実行してください:

python -m pip freeze > requirements.txt

あるいはただ:

pip freeze > requirements.txt

これにより、requirements.txt というファイルが作成されます。このファイルにはすべてのパッケージが含まれています。pip freeze コマンドは、requirements ファイルに適した出力を生成します。

中身を見たいですか?ファイルを開くだけです。

cat requirements.txt

このようなものが表示されます:

anyio==4.4.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==3.0.0
async-lru==2.0.4
attrs==24.3.0
[...]

ステップ3:要件ファイルを確認する(任意)

requirements ファイルには、直接インストールしていないものも含め、すべてのパッケージが含まれています。これらは依存関係と呼ばれます。

よりきれいなファイルにするためには、サブ依存関係を削除できます。実際に使用するメインのパッケージだけを残してください。pip freeze を行うと、自分で指定したパッケージだけでなく、これらのパッケージによってインストールされた依存関係も表示されます。

しかし、どれを削除すべきか分からない場合は、すべてをそのままにしておく方が安全です。問題なく動作します。

ステップ4:現在の環境を無効化する

先に進む前に、現在の環境、つまり Mypyenv を無効にしてください:

deactivate

あなたのプロンプトは通常に戻ります。これは、あなたがグローバルなPython環境に戻ったことを意味します。

ステップ5:新しい仮想環境を作成する

では、Pyenvという新しい仮想環境を作りましょう。まず、その場所を選んでください。

Python 3.3以降に標準搭載のvenvを使用する場合:

python3 -m venv Pyenv

これにより、Pyenvというフォルダーが作成されます。その中には、すぐに使用できるクリーンなPythonのインストールが含まれています。

ステップ6:新しい環境を有効にする

次のコマンドを使用して、作成したばかりの Pyenv 環境に切り替えます:

source Pyenv/bin/activate

再び、プロンプトに「(Pyenv)」が表示されるのが見えます。

(Pyenv) ostechnix@pvedebian:~$ 

ステップ7:要求ファイルからすべてのパッケージをインストールする

さあ、すべてを1つのコマンドでインストールします:

pip install -r requirements.txt

requirements ファイルを生成して、それを使って別の環境にインストールすることができます。このコマンドは requirements.txt ファイルを読み取り、そこにリストされているすべてのパッケージをインストールします。

パッケージの数によっては数分かかる場合があります。終了するまで待ってください。

ステップ8:すべてが正しくインストールされたか確認する

Pyenv環境にすべてのパッケージが揃っているか確認してください:

pip list
pip check

これは Pyenv にインストールされているすべてのものを表示します。何も欠けていないことを確認するために、requirements.txt ファイルと比較してください。

あなたのプロジェクトをテストすることもできます。メインのスクリプトを実行して、エラーなしで動作するか確認してください。

ステップ9:古い環境を削除する(任意)

新しいPyenv環境が完全に動作することを確認したら、古いMypyenvフォルダを削除できます。まず、これを無効化したことを確認してください:

deactivate

その後、単に Mypyenv フォルダを削除します:

rm -rf Mypyenv

または、ファイルマネージャーを通じてそれを削除するだけです。仮想環境は使い捨てを前提としているので、削除しても心配ありません。

覚えておくべき重要なヒント

常に特定のバージョンを使用する

パッケージを移行するときは、まったく同じバージョンを使用したいです。そうでないと、コードが壊れる可能性があります。だからこそ、pip freeze コマンドには terminado==0.18.1 のようにバージョン番号が含まれています。

要件ファイルを最新の状態に保つ

プロジェクトに新しいパッケージを追加するたびに、requirementsファイルを更新してください。これにより、常に最新の状態が保たれます:

pip freeze > requirements.txt

これを習慣にしなさい。後で面倒を避けられます。

すべてのプロジェクトに仮想環境を使用する

Pythonがサーバー管理に使用されている場合や単純なスクリプトを実行している場合を除き、仮想環境は常に使用するべきです。これにより、競合を防ぎ、プロジェクトを整理された状態に保つことができます。

新しいプロジェクトを始めるたびに、新しい環境を作成してください。それにはわずか数秒しかかかりません。

仮想環境を Git にコミットしないでください

あなたの仮想環境フォルダは非常に大きくなることがあります。場合によっては100MB以上になることもあります。誤ってコミットしないように、venv/ を .gitignore に追加してください。

その代わりに、requirements.txt ファイルをコミットしてください。他の開発者はそれを使って自分の環境を作成することができます。

一般的な問題のトラブルシューティング

1. pipというモジュールはありません

これは、古い環境に pip がインストールされていないか、pip が欠落している場合に発生します。

解決策:

古い環境内でpipを再インストールすることで修正できます:

source ~/Mypyenv/bin/activate
python -m ensurepip --upgrade

実際の環境パスに ~/Mypyenv を置き換えてください。

それでもうまくいかない場合は、次を使用してください:

curl -sS https://bootstrap.pypa.io/get-pip.py | python

それから、もう一度エクスポートを試してください:

python -m pip freeze > requirements.txt

環境があまりにも壊れている場合でも、site-packages フォルダーを確認することはできます:

ls ~/Mypyenv/lib/python*/site-packages/

そこから、主要なパッケージ名を書き留めて、新しい環境に手動で再インストールしてください。

2. apt-offline に一致する配布が見つかりませんでした

私のDebianシステムでこの特定のエラーが発生します。apt-offlineはシステムツールであり、PyPIパッケージではありません。

解決策:

requirements.txt からそれを削除するか、システムレベルのパッケージを自動的にフィルタリングしてください:

grep -vE '^(apt-offline|python-apt|apturl|pygobject|dbus|systemd)' requirements.txt > clean-requirements.txt
pip install -r clean-requirements.txt

実際にそれが必要な場合は:

sudo apt install apt-offline

3. pip freeze があまりにも多くのパッケージを表示する

時々、pip freeze はグローバルな Python インストールからパッケージをリストすることがあります。これは、仮想環境が正しく作成されなかった場合に起こります。

解決策:

新しい環境を作成してください。pip freeze を実行する前に、その環境をアクティブにしていることを確認してください。その後、必要なパッケージだけをインストールしてください。

4. 一部のパッケージがインストールできない

時々、パッケージのインストールに失敗することがあります。これはいくつかの理由で起こる可能性があります:

  • パッケージのバージョンが古すぎます
  • あなたのPythonのバージョンは互換性がありません
  • そのパッケージにはシステムレベルの依存関係が必要です

解決策:

パッケージを一つずつインストールしてみてください。ひとつが失敗した場合は、エラーメッセージを見てください。通常、何が問題かを教えてくれます。バージョン番号を更新するか、まずシステムの依存関係をインストールする必要があるかもしれません。

5. 古い環境ではコードは動作しますが、新しい環境では動作しません

通常、それはパッケージのバージョンが変更されて何かが壊れたことを意味します。

解決策:

両方の環境でPythonのバージョンを確認してください。バージョンが一致していることを確認してください:

python --version

もしそれらが異なる場合、それが問題かもしれません。また、requirements.txt ファイルを注意深く確認してください。すべてのバージョンが正しく固定されていることを確認してください。

6. そのようなファイルやディレクトリはありません: /usr/src/packages/BUILD/crit

このエラーは、古い環境に新しいシステムには存在しない ローカルビルド(例えば crit)が含まれていたことを意味します。

解決策:

安全に取り外すことができます:

grep -v "crit" requirements.txt > clean-requirements.txt
pip install -r clean-requirements.txt

またはソースから再インストールします:

git clone https://github.com/<user>/crit.git
cd crit
pip install .

7. すべての無効なエントリを自動的にクリーンアップする

解決策:

ほとんどのインストール問題を避けるために、requirements.txt を次のようにフィルタリングしてください:

grep -vE '(@ file:|file:///|^apt-|^python-apt|^apturl|^pygobject|^dbus|^systemd)' requirements.txt > clean-requirements.txt
pip install -r clean-requirements.txt

これは、すべての壊れたローカルパスとシステムパッケージを削除します。

8. pip freeze は多くをキャプチャしすぎる

pip freeze はネストされた依存関係を含むすべての依存関係を一覧表示します。

解決策:

トップレベルのインポートだけの最小限のリストを作成するには:

pip install pipreqs
pipreqs /path/to/your/project

異なるコンピュータ間でのパッケージの移動

もし別のマシンでプロジェクトをセットアップする必要がある場合はどうしますか?手順はほとんど同じです。

まず、requirements.txt ファイルを新しいコンピュータにコピーします。Git、メール、または USB ドライブを使用できます。その後、新しいマシンで:

  1. Pythonをインストールしてください、まだインストールされていない場合
  2. 上記のコマンドを使って新しい仮想環境を作成する
  3. お使いのOS用のアクティベーションコマンドでそれを有効化してください
  4. 実行 pip install -r requirements.txt

それで終わりです!仮想環境、pip freeze、requirements.txt はすべて、異なるシステムで Python パッケージを管理する便利な方法を提供します。

パッケージ移行の代替方法

より良い依存関係管理のためのpip-toolsの使用

一部の開発者は pip-tools を好みます。これはメインパッケージをその依存関係から分離します。これにより、requirements ファイルがよりきれいで管理しやすくなります。

Poetry または Pipenv の使用

これらは仮想環境を自動的に管理する現代的なパッケージマネージャです。pipやvenvよりも高度です。

Poetry は、プロジェクト依存関係管理のための機能が豊富なPythonツールです。ほとんどの仮想環境ツールよりも高速で、Pythonプロジェクトを管理するための強力なCLIが付属しています。

Pipenv は、もう一つの virtualenv 管理ツールです。プロジェクトのために自動的に virtualenv を作成します。

しかし、ほとんどのプロジェクトでは、標準の pip と venv の方法で問題なく動作します。

クイックリファレンス:チートシート

パッケージを移行する際に必要なすべてのコマンドの便利なリストはこちらです:

Mypyenv を有効にする:

source Mypyenv/bin/activate

エクスポートパッケージ:

pip freeze > requirements.txt

環境を無効化:

deactivate

Pyenvを作成する:

python3 -m venv Pyenv

Pyenvを有効化:

source Pyenv/bin/activate

パッケージをインストール:

pip install -r requirements.txt

インストールを確認する:

pip list

環境を移行する必要があるときにいつでも迅速にアクセスできるように、この参照を保存してください!

ベストプラクティスの要約

すべてをまとめると、覚えておくべき重要なポイントは次の通りです:

  1. 別々の環境を作成する:プロジェクトごとに仮想環境を作成します。
  2. まず常に有効化してください: パッケージをインストールする前に環境を有効化してください。
  3. 定期的に保存する: 新しいパッケージを追加した後は、pip freeze を使ってパッケージリストを保存してください。
  4. requirements.txt を格納する: プロジェクトフォルダに保存し、バージョン管理(例: Git)にコミットしてください。
  5. venvフォルダを除外: バージョン管理に仮想環境のフォルダをコミットしないでください。
  6. 移行後のテスト:移行後にコードを実行して、すべてが正常に動作することを確認してください。
  7. バージョンの固定を使用する:常に requirements.txt にバージョン番号を含めてください。
  8. ドキュメントの依存関係: requirements.txt に特定のバージョンが必要な理由を説明するコメントを追加してください。
  9. インタープリターの不一致を避けるために、pipの代わりにpython -m pipを使用してください。
  10. システムパッケージを仮想環境の外に保つ。
  11. 再インストール後に pip check を実行して、依存関係の健全性を確認してください。

よくある質問(FAQ)

Q: 異なるPythonバージョン間でパッケージを移行できますか?

A: はい、でも注意してください。いくつかのパッケージは新しいまたは古いPythonのバージョンでは動作しないかもしれません。例えば、Python 3.8から3.11にアップグレードする場合は、移行後にコードを十分にテストしてください。

Q: pip freezeとpip listの違いは何ですか?

A: 両方ともインストールされているパッケージを表示しますが、pip freeze は出力を requirements ファイル用にフォーマットします。移行には pip freeze > requirements.txt を使用し、パッケージを確認するだけなら pip list を使用してください。

Q: pip freeze からすべてのパッケージを含めるべきですか?

A: 場合によります。pip freeze はすべての依存関係を含みます。より整理された requirements にするには、直接の依存関係だけを手動でリストすることができます。しかし、すべてを含めることで正確な再現が保証されます。

Q: 移行後、パッケージをどのように更新しますか?

A: まず、新しい環境を有効にします。次に、特定のパッケージには pip install --upgrade package-name を実行するか、すべてを更新するには pip install --upgrade -r requirements.txt を実行します。

Q: 複数のプロジェクトで同じ requirements.txt を使用できますか?

A: プロジェクトが同一の依存関係を持っている場合のみです。それ以外の場合、各プロジェクトはプロジェクト固有のパッケージを含む独自の requirements.txt ファイルを持つべきです。

結論

異なる仮想環境間でPythonパッケージを移動することは、プロセスを理解すれば簡単です。現在の環境でpip freezeを使ってパッケージリストを保存し、新しい環境を作成して、保存したリストからインストールするだけです。

この方法は、古い環境の整理、Pythonのアップグレード、新しいシステムのセットアップのいずれの場合でも非常に効果的です。数分で済み、プロジェクトが新しい環境でも古い環境と全く同じように動作することを保証します。

仮想環境と要件ファイルは、Pythonの開発を格段にスムーズでより専門的にします。

覚えておいてください、新しいプロジェクトを始めるたびに、まず新しい仮想環境を作成してください。パッケージをインストールし、それらを requirements ファイルに固定すれば、準備完了です!

リソース:

  • Python公式ドキュメント - venvとpip
  • pip ドキュメント - pip freeze
  • PEP 508 - 依存関係の指定
  • ensurepip 公式ドキュメント