Python:同名包冲突,如何指定加载哪个?
我有两个包,它们安装了同名的不同包。它们都是“包”,因为它们都有顶层的 setup.py
文件,这个文件在 setup
命令中指定了 package=['foo']
。
如果我使用 distutils.core
来安装,最后安装的那个会覆盖之前的那个(不过我觉得只有当 .py 文件的名字都一样时,才会覆盖吧?)。如果我使用 setuptools
来安装,这两个包会被安装到不同的“蛋”里。
一个选择是,在导入包名之前,明确设置 sys.path
;不过这样做感觉不太符合 Python 的风格,有点不干净。
假设我已经在不同的 eggs
中安装了这两个同名的包,我该如何指定要导入哪个呢?
2 个回答
0
我觉得解决这个问题的最好办法是更改顶层目录的名字,前提是没有其他的包依赖于这个包。
你可以通过修改setup.py文件来实现,或者直接在site-packages文件夹里改名字。那个egg文件其实只是一些元数据。
至于设置sys.path,最好是使用site模块,方法是创建一个.pth文件。这个文件里的任何路径在被使用时都会被添加到Python路径的最前面。
这两个包是不同的,名字只是巧合,还是它们其实是同一个包的不同分支呢?
2
Setuptools指南提到了一种叫做 --multi-version(也就是 -m)的选项,这个选项会把包从 sys.path 中完全移除。你需要在代码中尽早使用 pkg_resources.require('package==version'),这样才能让它修复 sys.path。这个建议是 easy_install 在使用 -m 时总是会提示的。
不过,你不能同时导入两个包(除非它们是按照 命名空间包 的方式设计的)。