gpt4 book ai didi

python - 从不同路径添加子包

转载 作者:行者123 更新时间:2023-12-01 06:14:56 24 4
gpt4 key购买 nike

我有一个名为 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 集。纯 python 。再加上一些脚本。

布局是:

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

但是,如果 python-zypp 安装在/usr/lib64/python2.6/site-packages/zypp.py 上,则 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. PYTHONPATH

    来自Module Search Path documentation :

    When a module named spam is imported, the interpreter searches for a file named spam.py in the current directory, and then in the list of directories specified by the environment variable PYTHONPATH. This has the same syntax as the shell variable PATH, that is, a list of directory names. When PYTHONPATH is not set, or when the file is not found there, the search continues in an installation-dependent default path; on Unix, this is usually .:/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 调用类似,但将路径插入列表的开头。

关于python - 从不同路径添加子包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com