Python 3.8では、仮想環境に代わるものを追加することが提案されています-PEP 582パッケージのローカルディレクトリはPythonローカルパッケージディレクトリです。
このPEPでは、Pythonで__pypackages__
ディレクトリを自動的に検出し、インストール済みパッケージのソースとしてインポートするときに使用するメカニズムを追加することをお__pypackages__
ます。 __pypackages__
ディレクトリは、グローバルまたはカスタムパッケージディレクトリよりもインポートの優先度が高くなります。 これにより、仮想環境の作成、アクティブ化、または非アクティブ化が防止されます。
これは、 __pypackages__
を使用したパッケージ構造がPython 3.8でどのように見えるかです。
foo __pypackages__ 3.8 lib bottle myscript.py
この記事では、Python 3.8の終了を待たずにパッケージでローカルディレクトリを使用する方法を紹介します。
この記事では、LinuxでテストされたPython 3.5の基本的な例を説明します。 他のプラットフォームでは、変更が必要になる場合があります。
パッケージをローカルディレクトリにインストールする
インストールは、 --target
オプションを除き、pipを使用してパッケージをインストールするのとほぼ同じです。 その中に、ローカルパッケージを含むディレクトリへのフルパスまたは相対パスを示します。
pip3 install --target="$PWD/__pypackages__/3.5/lib/" bar
$ PWDは、現在の作業ディレクトリを持つ変数です。
次のディレクトリツリーが作成されます。
foo __pypackages__ 3.5 lib bar myscript.py
Pythonのバージョンとサブディレクトリは手動で指定する必要があります。
バイナリコードを含むパッケージを異なるアーキテクチャにインストールする必要がある場合にも問題が発生する可能性があります。 このようなパッケージはありませんでしたが、解決策として、ディレクトリ構造にアーキテクチャを追加できます。
特定のディレクトリにパッケージをインストールする別の方法があります。
pip3 install --ignore-installed --install-option="--prefix=$PWD/__pypackages__" --install-option="--no-compile" bar
ただし、インストール場所へのフルパスを指定する必要があり、ディレクトリツリーはPEP 582で提案されているものとは異なります。
foo __pypackages__ lib python3.5 site-packages bar myscript.py
パッケージでローカルディレクトリを使用する
パッケージをインストールした後、依存関係を探す場所をインタープリターに伝えることは残ります。
これを行うには、 sys.path
リストにパッケージを含むローカルディレクトリへのパスを追加します。 メイン(ロードされた最初の)モジュールにパスを追加するだけで十分です。他のモジュールに追加する必要はありません。 その後、ローカルにインストールされたパッケージをインポートできます。
import os import sys _PATH = '/__pypackages__/3.5/lib/' sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + _PATH) import bar
唯一の条件は、メインモジュールが__pypackages__
ディレクトリと同じレベルのネストにあること__pypackages__
。
パッケージを探す場所をPythonに伝える別の方法は、スクリプトを実行する前に環境変数を設定することです。
PYTHONPATH="$PWD/__pypackages__/3.5/lib/:$PYTHONPATH" python3 ./myscript.py
このような簡単な方法で、今すぐPEP 582に似た機能を実現できます。