1

zypp という Python パッケージがあります。これは swig によって生成され、rpm パッケージ (python-zypp と呼ばれます) によって次の場所に配置されます。

rpm -ql python-zypp
/usr/lib64/python2.6/site-packages/_zypp.so
/usr/lib64/python2.6/site-packages/zypp.py

現在、追加の API セットを提供する別のプロジェクトがあります。ピュアパイソン。さらに、いくつかのスクリプト。

レイアウトは次のとおりです。

bin/script1
python
python/zypp
python/zypp/plugins.py
python/zypp/__init__.py

plugins.py には Plugin クラスが含まれています。これをrpmに入れるつもりで、

/usr/lib64/python2.6/site-packages/zypp/plugins.py

script1 はこの Plugin クラスを使用します。しかし、git から実行してテストしているので、インストールされていない場合は git からもモジュールを見つけてほしいと思います。したがって、次のようなものがあります。

sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../python'))
from zypp.plugins import Plugin

ただし、python-zypp が /usr/lib64/python2.6/site-packages/zypp.py にインストールされている場合、script1 はもうプラグイン サブモジュールを見つけられないようです。python-zypp をアンインストールすると、アンインストールされます。

したがって、私の質問は、サブモジュールを追加してモジュールを拡張できるかどうかです。サブモジュールは別のロード パスにあります。それとも常に衝突しますか?

類推すると、モジュール foo があります。そして、別のロードパスで foo.extras を提供します (これは実際に foo を使用する可能性があります)。foo がシステム ロード パスで最初に見つかった場合、スクリプトは foo.extras を見つけません。カスタム ロード パスのみを使用すると、foo.extras で使用されている場合、スクリプトは foo モジュールを見つけられない場合があります。

私はルビーの経験が豊富ですが、ルビーでは次のようにインストールできました。

/usr/lib64/ruby/gems/1.8/gems/foo-1.0/lib/foo/*

そして、スクリプトに次のように記述できます。

bin/script
lib/foo/extras/*

私はスクリプトで行うことができます:

$: << File.join(File.dirname(__FILE__), "../lib"

そして、私のスクリプトは

require foo
require foo/extras

foo/extras がシステムまたはカスタム ロード パスにインストールされているかどうかは関係ありません。彼らは衝突しません。

逆に、PYTHONPATH を使用すると、ローカルの zypp.plugins が最初に検出されることがわかりました。しかし、インストールされた zypp モジュールが見つかりません:

import zypp # works, but seems to import the local one
from zypp.plugins import Plugin # works, PYTHONPATH finds it first

repoinfo = zypp.RepoInfo() # does not work
4

1 に答える 1

2

あなたの質問を正しく理解できれば、インストールされたモジュールの代わりにそのモジュールの開発バージョンを使用したいと考えています。したがって、使用できます

  1. パイソンパス

    モジュール検索パスのドキュメントから:

    spam という名前のモジュールがインポートされると、インタプリタは現在のディレクトリで spam.py という名前のファイルを検索し、次に環境変数 PYTHONPATH で指定されたディレクトリのリストを検索します。これは、シェル変数 PATH と同じ構文、つまりディレクトリ名のリストです。PYTHONPATH が設定されていない場合、またはファイルが見つからない場合、検索はインストールに依存するデフォルト パスで続行されます。Unix では、これは通常 .:/usr/local/lib/python です。

    したがって、モジュール ディレクトリの GIT ツリーが「/home/username/some/path」である場合、PYTHONPATH を「/home/username/some/path」に変更します。または、PYTHONPATH 変数が既に使用されている場合は、「:/home/username/some/path」を追加します (コロン区切りに注意してください)。これを永続的にするには、「PYTHONPATH=value」という行を「/etc/environment」ファイルに追加します。

  2. sys.path.insert

    プログラムの開始スクリプトがある場合は、を使用してモジュール検索パスをオーバーライドできますsys.path.insert(0, "somepath")。これは、sys.path.append説明した呼び出しに似ていますが、パスをリストの先頭に挿入します。

于 2010-09-30T10:52:23.740 に答える