从其他路径添加子包

2024-10-01 02:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为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。加上一些剧本。在

布局是:

^{pr2}$

在插件.py包含一个插件类。我打算把这个放进转速,然后把它放到

/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

但是,如果pythonzypp安装在/usr/lib64/python2.6/site-packages上,那么看起来/zypp.py公司,则script1将不再找到插件子模块。如果我卸载pythonzypp,它就会卸载。在

所以我的问题是,是否可以通过添加子模块来扩展模块,因为子模块位于不同的加载路径中。还是他们总是冲突?在

比方说,我有一个foo模块。我提供外卖部在一个不同的加载路径中(实际上可能使用foo)。剧本找不到外卖部如果在系统加载路径中首先找到foo。如果我只使用自定义加载路径,脚本可能找不到foo模块如果外卖部使用它。在

但是,在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是安装在系统上还是安装在自定义加载路径中。他们不冲突。在

另一方面,我发现当地的PYTHONPATHzypp.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

Tags: 模块pathpyimport路径插件fooos
1条回答
网友
1楼 · 发布于 2024-10-01 02:31:31

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

  1. Python路径

    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”(注意冒号分隔符)。为了使其永久化,在文件“/etc/environment”中添加一行“PYTHONPATH=value”。

  2. 系统路径插入

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

相关问题 更多 >