若安装两个提供同名import package的distribution package,哪个会被导入?
Python同名Import包的导入优先级问题
快速提示
- Distribution Package:即通过
pip安装的包,一个distribution package可包含多个import package,二者名称可相同也可不同。例如distribution packagescikit-learn对应的import package是sklearn。
问题解答
当通过pip安装两个都提供同名import package(比如foo)的distribution package(比如a和b)时,执行import foo的导入结果由Python模块搜索路径的顺序决定:
- Python会按照
sys.path列表的顺序依次查找foo模块/包,哪个distribution package的安装路径更早出现在sys.path中,就会优先导入它提供的foo - 包的安装顺序会影响
sys.path:如果先装包a再装包b,包b的路径通常会被加到sys.path更靠前的位置,此时import foo会导入包b的版本;反之则导入包a的版本 - 若使用
pip install --upgrade更新其中一个包,更新后的包路径会被移到sys.path前端,从而覆盖原有的导入优先级
这种情况属于典型的包冲突,会导致代码行为不可预测,建议尽量避免安装提供同名import package的distribution package。
内容的提问来源于stack exchange,提问作者orlp
相关产品推荐
相关产品推荐

