从不同的路径添加子包

时间:2010-09-30 10:41:26

标签: python load-path

我有一个名为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

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您希望使用该模块的开发版本而不是已安装的模块。因此,您可以使用

  1. <强> 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”。

  2. <强> sys.path.insert

    如果您的程序有启动脚本,则可以使用sys.path.insert(0, "somepath")覆盖模块搜索路径。这类似于您描述的sys.path.append调用,但将路径插入列表的开头。