Pythonメジャーバージョンのアップグレード後にパッケージを仮想環境に自動的に再インストールする


10

venvPython 3.6のモジュールによって作成されたいくつかの仮想環境(数十)がディスク上にあります。今私は急いでUbuntu 19.10にアップグレードしましたが、その後、一般に認められたソースからUbuntu 3.6がまったく利用できないことに気づきました。私は自分のホームディレクトリの下に配置し、含まれているフォルダーで実行することにより、これらの仮想環境のPythonバージョンをアップグレードすることができました。bin/python3python3.7 -mvenv --upgrade

現在、python3.7 -mvenv --upgrade仮想環境でPython をアップグレードしている間、以前のバージョンのパッケージをそのlib/python3.7/site-packages下に再インストールすることはありませんvenv。私は、Pythonの3.6をインストールすることでこれを行っている可能性が推測pip freezeからの要求をINGのvenv、その後のPython 3.7にvenvをアップグレードpip install -r- INGの場合のみ、 Pythonの3.6は、私の新しいOSで使用可能なインストールがありました。

ソースからPython 3.6をインストールしたり、condaを使用したり、ランダムなPPAから3.6をインストールしたりすることなく、かなり自動化された方法で(おそらく主pip freezeに古いlib/python3.6ディレクトリを使用して)これを行う他の方法はありますか?すべての環境をまとめてアップグレードしたいので、将来、ランダムな環境で何かをする必要があるときに、Python 3.7で作業を続けることができます。

回答:


11

新しい3.7 venvでpkg_resources使用できるはずです- setuptools作成時に自動的にインストールされます。そうでない場合は、単にpip install setuptools

setuptoolsライブラリコードは、実際にpipはベンダーが機能するためのものですpip freeze。ただし、手動でフリーズするだけです。

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

その出力をrequirements.txtファイルに入れて、python3.6ランタイムを必要とせずに再構築されたサイトを機能させることができます。

プロジェクトがディストリビューションメタデータで環境マーカーを使用してpython3.6とpython3.7の個別の依存関係ツリーを宣言できるため、このメソッドは100%完全であるとは限らないことに注意してください(PEP 508を参照)。また、3.6サイトにインストールされているアイテムが3.7 をまったくサポートしていない可能性もあります。ただし、マイナーバージョンで3.6と3.7の間のバンプが見られることはほとんどありません。そのため、実際にはワーキングセットを使用するだけで「十分」であるはずです。


この場合、「十分に良い」十分です。バルク作業が終わった後、あちこちで奇数モジュールを更新しても問題ありません。
Antti Haapala
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.