两个Python包共享相同模块名时,如何指定导入目标包的对应模块?
冲突原因说明
Python 导入系统仅识别实际模块名,不识别 PyPI 上的分发包名。docopt 和 docopt-ng 两个第三方包安装后,对外暴露的可导入模块名都是 docopt,默认导入时会加载 sys.path 搜索路径中排序更靠前的路径下的 docopt 模块,因此会出现导入结果不符合预期的问题。你之前尝试的 from docopt-ng import docopt 写法不可行,因为 docopt-ng 是分发包名,不是实际模块名。
可行解决方案
方案1:按文件路径精准导入(无环境依赖,一次生效)
直接指定 docopt-ng 对应的模块文件路径导入,不会受搜索路径优先级影响,操作如下:
- 执行命令查询 docopt-ng 的安装位置:
pip show docopt-ng
在返回结果中找到 Location 字段的取值,例如为 /your/env/path/lib/python3.x/site-packages,那么 docopt-ng 对应的模块文件路径就是 ${Location}/docopt/__init__.py。
2. 使用 importlib 加载指定路径的模块:
import importlib.util import sys # 替换为上一步查到的实际路径 docopt_ng_path = "/your/env/path/lib/python3.x/site-packages/docopt/__init__.py" spec = importlib.util.spec_from_file_location("docopt", docopt_ng_path) docopt = importlib.util.module_from_spec(spec) sys.modules["docopt"] = docopt spec.loader.exec_module(docopt) # 验证导入的是否为docopt-ng版本 print(docopt.__file__)
后续代码直接使用 docopt 变量即可,就是 docopt-ng 提供的版本。
方案2:环境隔离(长期使用推荐)
如果是不同项目需要分别使用 docopt 和 docopt-ng,可以为每个项目创建独立的虚拟环境,在对应环境中仅安装所需的包即可完全避免冲突:
- 只需要 docopt-ng 的环境:
pipenv install docopt-ng,不安装原版 docopt - 只需要原版 docopt 的环境:
pipenv install docopt,不安装 docopt-ng
内容的提问来源于stack exchange,提问作者MatthewMartin
相关产品推荐
相关产品推荐

