Pythonでローカルパッケージディレクトリを使用する

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に似た機能を実現できます。








All Articles