我有一个名为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
但是,似乎如果在/usr/lib64/python2.6/site-packages/zypp.py上安装python-zypp,那么script1将不再找到插件子模块。如果我卸载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
答案 0 :(得分:2)
如果我正确理解您的问题,您希望使用该模块的开发版本而不是已安装的模块。因此,您可以使用
<强> PYTHONPATH 强>
来自Module Search Path documentation:
当导入名为spam的模块时,解释器会在当前目录中搜索名为spam.py的文件,然后在环境变量PYTHONPATH指定的目录列表中搜索。它具有与shell变量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”。
<强> sys.path.insert 强>
如果您的程序有启动脚本,则可以使用sys.path.insert(0, "somepath")
覆盖模块搜索路径。这类似于您描述的sys.path.append
调用,但将路径插入列表的开头。