我有一个名为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
如果我正确理解您的问题,您希望使用该模块的开发版本,而不是已安装的模块。因此,您可以使用
Python路径
从Module Search Path documentation:
因此,如果模块目录的GIT树是“/home/username/some/path”,那么可以将PYTHONPATH更改为“/home/username/some/path”。或者,如果PYTHONPATH变量已经在使用中,您可以在它后面附加“:/home/username/some/path”(注意冒号分隔符)。为了使其永久化,在文件“/etc/environment”中添加一行“PYTHONPATH=value”。
系统路径插入
如果有程序的启动脚本,可以使用
sys.path.insert(0, "somepath")
覆盖模块搜索路径。这与您描述的sys.path.append
调用类似,但将路径插入列表的开头。相关问题 更多 >
编程相关推荐