【发布时间】:2023-04-03 22:45:01
【问题描述】:
我有一个名为 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
但是,如果 python-zypp 安装在 /usr/lib64/python2.6/site-packages/zypp.py 上,那么 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
【问题讨论】: