我有一个名为 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 包含一个插件类。我打算把它放在一个 rpm 中,然后放入
/usr/lib64/python2.6/site-packages/zypp/plugins.py
script1 使用这个插件类。但是当我测试它从 git 运行时,如果它没有安装,我希望它也能从 git 中找到模块。所以它有类似的东西:
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../python'))
from zypp.plugins import Plugin
但是,似乎如果在 /usr/lib64/python2.6/site-packages/zypp.py 上安装了 python-zypp,那么 script1 将不再找到 plugins 子模块。如果我卸载 python-zypp,它可以。
所以我的问题是是否可以通过添加子模块来扩展模块,因为子模块位于不同的加载路径中。还是他们总是会发生冲突?
一个类比是,我有一个模块 foo。而且我在不同的加载路径中提供了 foo.extras (实际上可能使用 foo )。如果在系统加载路径中首先找到 foo,则脚本将找不到 foo.extras。如果我只使用自定义加载路径,如果 foo.extras 使用它,脚本可能找不到 foo 模块。
我对 ruby 有更多经验,但在 ruby 中我可以安装:
/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