1

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

1 回答 1

2

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

  1. 蟒蛇路径

    模块搜索路径文档

    当导入名为 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您描述的调用,但将路径插入列表的开头。

于 2010-09-30T10:52:23.740 回答