venvの環境移行方法

Rasberry piに既存の環境を移す等、作成したPythonの環境を他のPCに移したいという需要はよくあると思います。
1台目も2台目もオンラインPCの場合はライブラリを"requirements.txt"に書いて、"pip install -r requirements.txt"でインストールするのが最も簡単です。
一方、プロキシ等の関係で、オンラインで構築した環境をオフラインに移したい場合はなかなかありません。
一番簡単に思いつくのはvenvで作成した環境をそのままコピーすることですが、その場合コピーした環境はコピー元のパス等を参照するので、他のPCに移すと仮想環境内のpipで入れたライブラリを見るのではなく、デフォルトのpipで入れたライブラリを参照します。
そのため、仮想環境内のnumpy等のライブラリを参照してくれません。


調査したところ、環境に移す手法はネット上にいろいろとありますが、オフライン環境への移行の場合かつ日本語で有用なのは以下の2つしか見つかりませんでした。
オフライン環境: pipでファイルからpythonパッケージインストール - Qiita
https://dk521123.hatenablog.com/entry/2021/07/10/164833

venvの環境をコピーするのは以下?
https://www.hinomaruc.com/venv-activate-not-changing-python-path/

ただし、私の環境ではLinuxOSのバージョンの違いやwhlファイルのバージョンをすべて変更する必要があるなどが原因でどの方法もうまくいきませんでした。
なので、もう少し簡単にできないかを実験してみました。

目的
 オンラインで作成した仮想環境をもう一つのほうにコピーする

環境準備

今回はもう1つのPCを用意できなかったので、wsl内 (OS: Ubuntu) に2つの仮想環境を作ります。
そして、1つをオンラインの1台目PC (以下、オンラインPC環境) と、もう1つをオフラインの2台目PC (以下、オフラインPC環境) とし、移行したときにオフラインPC環境が元のオンラインPC環境のパスを参照していないかを確認します。

まず、オンラインPC環境として"test_ori"、オフラインPC環境として"test_1"を作成します。bashの実行場所はvirtual_env/下です。以降は基本的にこのディレクトリから動きません。

$ python3 -m venv test_ori
$ python3 -m venv test_1
wsl内に作成した2つの仮想環境

次にオンラインPC環境に入って、ライブラリ (numpyとopencv) をインストールします。

$ source test_ori/bin/activate
$ pip install numpy opencv-python
仮想環境にインストールしたライブラリ

VSCodeでフォルダを見てみると、"test_ori"の方には"lib64/python3.8/site-packages"の下に"numpy"や"cv2"といったものができています。
一方、"test_1"の方には何も入れていないので"lib64/python3.8/site-packages"の下に"numpy"や"cv2"といったものはできていません。

ライブラリがインストールされているかを確認するため、"pip list"コマンドでも確認してみます。

test_oriの環境を確認
$ source test_ori/bin/activate
$ pip list

Package       Version 
------------- --------
numpy         1.24.4  
opencv-python 4.8.0.76
pip           20.0.2  
pkg-resources 0.0.0   
setuptools    44.0.0
test_1の環境を確認
$ source test_1/bin/activate
$ pip list

Package       Version
------------- -------
pip           20.0.2 
pkg-resources 0.0.0  
setuptools    44.0.0

ライブラリがインストールされていることが確認されました。

環境のコピー方法

仮想環境を作成した時点でpipとpythonのパスはそれぞれ仮想環境内のパスへと通っているので、"lib64/python3.8/site-packages"内のやつを移したらいいのでは?、と考えて移してみました。
単純に、"test_ori”内の"lib64/python3.8/site-packages"を、"test_1”内の"lib64/python3.8/site-packages"へとコピーしただけです。

コピー後

単純にすべてコピーしたので、同じフォルダは" copy"とついています。意味はないですが、面倒なので消していないだけです。
この状態で"pip list"と"import"を試してみます。

test_1で確認
$ source test_ori/bin/activate
$ pip list

Package       Version 
------------- --------
numpy         1.24.4  
opencv-python 4.8.0.76
pip           20.0.2  
pkg-resources 0.0.0   
setuptools    44.0.0  
$ python
>>> import numpy
>>> (エラーが表示されずに実行できることを確認)

test_1に環境がコピーできて、実行も問題なさそうです。
仮想環境のフォルダ毎コピーするとパスが通らないという問題がありましたが、このように先に仮想環境を作ってその中のライブラリフォルダを更新することで、オフラインPC環境移行が可能になりました。

その他

"仮想環境/share"の中にwhlファイルがあって、これをうまく使えれば別の方法でオフライン環境に移行することができるかもしれません。
ただ、現状ではshare内のものは作成時の状況を反映しているらしく、新しくインストールしたnumpyやopencvは反映されていませんでした...
現在のライブラリをshare内に反映する、みたいなコマンドがあればいけるかもしれませんね。

そもそも、このshareフォルダ内のやつは何か意味があるんだろうか...