3

にさまざまなプロジェクト ディレクトリを追加することにより、相対インポートを多用する大規模な Python プロジェクトのサポート ライブラリに取り組んでいsys.pathます。

The Hitchhiker's Guide to Packagingをテンプレートとして使用して、ローカル インストールを可能にするパッケージ構造を作成しようとしましたが、後で必要に応じてグローバル インストールに簡単に変更できます。

私のパッケージの依存関係の 1 つは、ASN.1 アノテーション付きオブジェクトのエンコードとデコードのためのpyasn1パッケージです。pyasn1CentOS 6.3 のデフォルト リポジトリでサポートされているバージョンは 1 つ前のメジャー バージョンであり、カスタム パッケージを壊す既知のバグがあるため、ライブラリを個別に含める必要があります。

ライブラリ構造のトップレベルは次のとおりです。

MyLibrary/
  setup.py
  setup.cfg
  LICENSE.txt
  README.txt
  MyCustomPackage/
  pyasn1-0.1.6/

セットアップ構成ファイルで、ライブラリのインストール ディレクトリを というローカル ディレクトリに定義します.libimport 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) パッケージを別の名前で強制的にインストールさせる方法はありますか?

4

1 に答える 1

2

virtualenvを使用 して、ライブラリの OS バージョンから独立した完全に既知の構成でアプリケーションが実行されるようにします。

編集: 迅速な (unix) 解決策は、PYTHONPATH環境変数を設定することです。これPATHは、Python モジュールの場合と同じように機能します (モジュールは、見つかった最初のパスからロードされるため、ディレクトリを の先頭に追加するだけですPYTHONPATH)。とにかく、あなたが直面しているような状況を処理するために特別に設計されているため、に進むことを強くお勧めします.virtualenv

根拠

で依存関係を指定するsetuptoolsスクリプトを作成すると、このプロセスは簡単に自動化できますinstall_requires。完全な例については、私が書いたこれを参照してください

設定

setup.sh以下の手順をシェル スクリプトに簡単に挿入できることに注意してください。

最初に virtualenv を作成して入力します。

$ virtualenv $name
$ cd $name

それを有効にします:

$ source bin/activate

cdプロジェクト ディレクトリに移動し、インストーラー スクリプトを実行します。

$ cd $my_project_dir
$ python ./setup.py --prefix $path_to_virtualenv

--prefix $path_to_virtualenvシステム全体ではなく virtualenv にインストールするようにスクリプトに指示するために使用される に注意してください。virtualenv をアクティブ化した後にこれを呼び出します。すべての依存関係が自動的にダウンロードされ、virtualenv にインストールされることに注意してください。

その後、完了です。virtualenv を離れたい場合は、次を発行します。

$ deactivate

後続の呼び出しでは、必要に応じて a を使用して、virtualenv をアクティブ化するだけで済みます (ステップ 2) runawesomeproject.sh

virtualenv Web サイトに記載されているように、以前のバージョンでは HTTPS 経由で依存関係をダウンロードしなかったため、virtualenv >= 1.9 を使用する必要があります。プレーンな HTTP で十分だと考える場合は、どのバージョンでも十分です。

再配置可能な virtualenvs を試すこともできます。セットアップして、フォルダーをホストにコピーします。とにかく、この機能はまだ実験的であることに注意してください。

于 2013-05-05T23:02:27.060 に答える