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