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



Source: https://habr.com/ru/post/J444504/


All Articles