【 Python 】仮想環境 venv の複製方法(”コピぺ” ダメ!絶対!)

python

PC環境一覧

OS:macOS[Monterey]
CPU:Intel® Core™ i7
メモリ:32GB

OS:Windows11
CPU:Intel® Core™ i9 13900KF
メモリ:64GB

Python:3.9.4
pip:20.2.3

■ 初めに

仮想環境は「コピー&ペースト」で複製または移動させても動きません。
(ある意味)

冒頭では、動かない(動作に問題が発生する)要因を説明いたしますので、解決方法のみを知りたい方は
■ 解決方法(正しい仮想環境の複製)
まで読み飛ばしてください。

以降で Windowsと Mac(Linux)のコマンドを分けて記載していますが、分けられていないコマンドは共通です。

■ 問題が起きる要因

□ 仮想環境の設定

本記事をご覧になられているということは、仮想環境の構築に venvを使用していると思います。

仮想環境を有効化する際は、下記コマンドを実行します。

$ start .\[仮想環境名]\Scripts\activate
Macの場合
$ source ./[仮想環境名]/bin/activate

activate」ファイルを実行しているので、この中で設定されている内容に伴う処理が実行されて仮想環境が有効化されている訳です。

百聞は一見に如かずだと思うので、その該当箇所を見てみましょう。

activate」ファイルを Visual Studio Code 等で開いてみてください。
以下の添付画像(赤枠)が、仮想環境を示す(有効化する)パスを VIRTUAL_ENV変数に設定しています。

activateファイルの定義(Windows)

□ 有効化される仮想環境

具体的な例を挙げて説明します。
仮想環境を下記に示すように複製(または移動)したいとしましょう。

  • 複製
    • Z:\python\origin\[仮想環境]
  • 複製
    • Z:\python\sub\origin\[仮想環境]

複製した後に、複製の環境下が有効化となることが望ましいですが、お察しの通りそうはいきません。
なぜなら、複製したままなので「activate」ファイル内の VIRTUAL_ENV変数が指し示す場所は、複製のままだからです。

ということは、複製したで仮想環境の有効化を行っても、知らずの内に複製が有効化されています。
また、複製自体が存在しているのでエラーになることはありません。

またまた、仮想環境の良いところは開発に必要なパッケージを仮想環境内に留めておくことができるのが最大の恩恵ですが、このままだと、複製で心機一転してパッケージの追加インストールを行っても、インストールされるのは複製となり複製で使用することができず「なぁぜなぁぜ」になります。

前提条件として、複製を複製後に削除せず環境が残っている状態では、複製で仮想環境の有効化を行っても複製元が正常に有効化されてエラーとはならずにパッケージのインストールが複製元に行われるので要注意してください。

■ 解決方法(正しい仮想環境の複製)

[1]複製元で使用しているパッケージを出力

# 仮想環境を有効化
$ start .\origin\[仮想環境名]\Scripts\activate

# パッケージを出力
$ pip freeze > requirements.txt
Macの場合
# 仮想環境を有効化
$ source ./origin/[仮想環境名]/bin/activate

# パッケージを出力
$ pip freeze > requirements.txt

出力ファイル名は「requirements.txt」でなくても、任意の名前で良いです。

[2]複製先で仮想環境を構築

# 仮想環境の複製先を作成/移動
$ mkdir sub
$ cd sub

# 仮想環境を構築
$ python -m venv [仮想環境名]

# 仮想環境を有効化
$ start .\[仮想環境名]\Scripts\activate
Macの場合
# 仮想環境の複製先を作成/移動
$ mkdir sub
$ cd sub

# 仮想環境を構築
$ python3 -m venv [仮想環境名]

# 仮想環境を有効化
$ source ./[仮想環境名]/bin/activate

[3]複製元で使用していたパッケージを複製先でインストール

[1]複製元で使用しているパッケージを出力で出力した「requirements.txt」を使用します。

requirements.txt」を複製先である仮想環境内直下に持ってきてください。

# 配置場所
sub
├─ .venv
│  ├─ Include
│  ├─ Lib
│  │  ├─ <省略>
│  ├─ Scripts
│  │  ├─ <省略>
├ requirements.txt        ← ここ
├ <省略>
Macの場合
# 配置場所
sub
├─ .venv
│  ├─ bin
│  ├─ include
│  ├─ lib
│  │  ├─ <省略>
├ requirements.txt        ← ここ
├ <省略>

下記コマンドを実行して、パッケージをインストールします。

# パッケージを requirements.txtからインストール
$ pip install -r requirements.txt

# インストールされたパッケージを表示
$ pip freeze

以上で完了です。

■ 最後に

たったの 3手順で出来ましたね。

が、たかだか複製や移動で毎回行うのでは面倒ですよね。
なので筆者は新規プロジェクトを立ち上げる時は、かなり慎重に場所(パス)を検討してから行う癖を付けています。

筆者自身、試行したことはないですが、複製元の環境を一式全てをコピーして複製先にペーストし、「activate」ファイル内を複製先と整合性が取れるように修正してから仮想環境を有効化すると問題なく動作確認できると思ってます。

多分、venvの仮想環境に関する依存関係を示すファイルは「activate」だけだと思うので。

■ 余談

開発現場で Pythonを使用する場合、開発(プロジェクト)専用に PCの環境が容易されることが一般的なので、仮想環境の出番は少ないかもしれません。

なぜなら、専用なので環境が汚れることを懸念する必要がないからです。

あくまで、Pythonの仕様的に、Python本体がインストールされている直下にパッケージがインストールされていくので、環境を分けてあげないと各バージョンで競合が発生することになります。

そうなってくると、Python言語のバージョンに関する管理方法pyenv)が有効的なのですが、筆者みたいに徹底的に環境の住み分けをさせたい場合は、以下の記事も参考にしてみてください。

最近はね、何でもかんでも便利になり過ぎて、深く把握してなくても数手順で環境構築や開発ができるので助かるんですけど、この職業の最大の難関は不具合発生や躓いた時の原因究明が 1番 地獄で頭を抱えますから。

これらの概念や仕組みを理解しているか否かでは不具合発生時に頼れる強いエンジニアになれるので頑張っていきましょう。

comment 📝

タイトルとURLをコピーしました