にさまざまなプロジェクト ディレクトリを追加することにより、相対インポートを多用する大規模な Python プロジェクトのサポート ライブラリに取り組んでいsys.path
ます。
The Hitchhiker's Guide to Packagingをテンプレートとして使用して、ローカル インストールを可能にするパッケージ構造を作成しようとしましたが、後で必要に応じてグローバル インストールに簡単に変更できます。
私のパッケージの依存関係の 1 つは、ASN.1 アノテーション付きオブジェクトのエンコードとデコードのためのpyasn1
パッケージです。pyasn1
CentOS 6.3 のデフォルト リポジトリでサポートされているバージョンは 1 つ前のメジャー バージョンであり、カスタム パッケージを壊す既知のバグがあるため、ライブラリを個別に含める必要があります。
ライブラリ構造のトップレベルは次のとおりです。
MyLibrary/
setup.py
setup.cfg
LICENSE.txt
README.txt
MyCustomPackage/
pyasn1-0.1.6/
セットアップ構成ファイルで、ライブラリのインストール ディレクトリを というローカル ディレクトリに定義します.lib
。import site; site.addsitedir("MyLibrary/.lib")
プロジェクトのメイン アプリケーションでコマンドを実行することにより、エンジニアがセットアップ スクリプトにコマンド ライン引数を渡さなくても、絶対インポートを実行できるので、これは望ましいことです。
setup.cfg
[install]
install-lib=.lib
setup.py
setup(
name='MyLibrary',
version='0.1a',
package_dir = {'pyasn1': 'pyasn1-0.1.6/pyasn1'},
packages=[
'MyCustomPackage',
'pyasn1',
'pyasn1.codec',
'pyasn1.compat','
pyasn1.codec.ber',
'pyasn1.codec.cer',
'pyasn1.codec.der',
'pyasn1.type'
],
license='',
long_description=open('README.txt').read(),
data_files = []
)
この方法でインストールを行う際に遭遇した問題は、パッケージをインポートしようとするとpyasn1
、グローバル バージョンがインポートされ、ローカルにインストールされたバージョンが無視されることです。
pyasn1
考えられる回避策として、グローバル パッケージとは異なる名前 (例: pyasn1_0_1_6
) でパッケージをインストールしようとしましたpackage_dir = {'pyasn1_0_1_6':'pyasn1-0.1.6/pyasn1'}
。pyasn1
ただし、パッケージの内部で使用されるインポートではpyasn1_0_1_6
名前が使用されないため、これは失敗します。
a) グローバルにインストールされたパッケージの上にローカルにインストールされたパッケージを Python に強制的にインポートさせるか、b) パッケージを別の名前で強制的にインストールさせる方法はありますか?