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

python

はじめに:動く?動かない?

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


主のPC環境一覧

PC:Mac OS[Monterey]
CPU:Intel Core i7
メモリ:32GB
Python:3.9.4

※以下、コマンドを Mac用で書いているので Windowsの方は適宜置き換えて実行してください。
一部、親切心でなぜが一部、Windowsコマンドで書いているところもある ←
Macは「$ Python3 ~」やけど、Windowsは「$ Python ~」で良いとか気を付けてね🙇🏼‍♀️💭


動かない理由は?

仮想環境(venv)の構築方法は既に知っていると思います。

// 仮想環境構築
$ python3 -m venv <仮想環境名>

// 仮想環境内
$ cd <仮想環境名>


// Mac
$ ls

// Windows
$ dir

=============================================================

// 仮想環境が生成され、以下のフォルダやファイルが生成されていることを確認
# bin    inclide    lib    pyvenv.cfg

上記コマンドで、仮想環境を動かすのに必要なファイルやフォルダが生成されます。

改めて思い通りに動かない理由は、任意の場所でターミナル(またはコマンドプロンプト)で仮想環境を構築したってことは、その指定した任意の場所(ディレクトリ)に紐付いているからなんですねぇ。


ポイント_1

仮想環境を有効化する際に、以下のコマンドを叩きます。

// Mac
$ source <仮想環境名>/bin/activate

// Windows(バックスラッシュに気を付けること)
$ start <仮想環境名>\Scripts\activate

=============================================================

// 以下のように仮想環境が「( )」で囲まれたパス表示になっていれがOK
(<仮想環境名>)Users/username...

この「activate」を実行することで仮想環境が有効になるわけですが、この中身が当初に構築した内容と紐付いているから「コピー&ペースト」しても、その中身が移動元の情報で整合性が取れなくなりそのまま開発を続けていくと思い通りに動作しなくなるんですねぇ。

【動かなくなる例】
Ex. 新しいライブラリをインストールし、利用したい。
A. インストールされたのは移動元の仮想環境内なので使えません。


ポイント_2

「activate」の中身を、コードエディタで見たら一目瞭然だと思います。
素人目で見ても「あ、ここのパスか、、」って瞬時に分かると思います。

「bin/activate」の中身

「Users/username/Main」の中に仮想環境を構築
「Users/username/Sub」に移動したい

移動元から移動先に「コピー&ペースト」するということは、言葉通り中身をそのまま複製して貼り付ける訳ですから、紐付いて構築される仮想環境側としては「いやいや、有効化しますけど元の場所やけどえぇのん?」ってなります。

<※ 注意 ※>有効化状態になるのは移動元

上記の文章では少し語弊がありましたが、有効化状態にはなります。(※移動

でも、実現したいのは複製または移動先の環境で「有効化」したいんですよね?
なので「activate」してもエラー等吐かれず、何も問題ないように錯覚してしまうのが落とし穴なので大変とても必ず気を付けましょう。


解決方法:お待たせいたしました。

まずは、流れを記載します。
[1] 移動元のライブラリを書き出し
[2] 移動先で仮想環境を構築し有効化
[3] 移動先で、移動元で書き出したものを読み込む


[1] 移動元のライブラリを書き出し

移動元の仮想環境を有効化し以下のコマンドを入力
・仮想環境直下に「requirements.txt」というテキストファイルが書き出される。
・その中に、仮想環境内でインストールされた全てのライブラリが記載されている。

$ pip freeze > requirements.txt

[2] 移動先で仮想環境を構築し有効化

// 移動先に「Sub」という新しい仮想環境を構築
$ python3 -m venv <Sub>

// 有効化
$ source Sub/bin/activate

・上記コマンドの実行が済んだら、[1]で書き出した「requirements.txt」を新たに構築した仮想環境(Sub)直下に持ってくる。


[3] requirements.txtを読み込み

$ pip install -r requirements.txt

// ライブラリ確認
$ pip freeze

// requirements.txt内のライブラリ群が表示
# ...
# ..
# Successfully installed ...

ここまで済んだら移動元の環境と全く同じの、新たな仮想環境が構築されたので今後の開発に応じてガンガンライブラリ等インストールして開発を進めてください。


最後に

いつも前置きが長くなってすみません。

主自身「できないんだ!」って分かったとしても『何でできないんだ?』が付き纏ってしまい、それはそれは気になって気になって夜も熟睡しかできないもんで、、

こんな性格なもんですから、できないことを解決するのに『理由も一緒に書かれてる』ドキュメントをいつも探してました。

そんな同士の強い味方になれれば幸いです。

お疲れ様でした。

comment 📝

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