如何在自有Python包中正确引入GitHub第三方包并解决导入错误?
这是Python包开发里很常见的导入路径坑,我给你几个实用的解决方案,你可以根据自己的场景选:
方法一:修改第三方包内部的导入为相对导入
直接调整someones_package/file2.py里的导入语句,把原来的:
import file1
改成相对当前包的导入写法:
from . import file1
这样不管外部的基准目录是什么,file2.py都会从自己所在的someones_package目录里找file1.py,完美适配它现在作为子包的位置。
注意:如果之后你要更新这个第三方包,可能需要重新修改导入语句,这点要提前记下来。
方法二:把第三方包目录加入Python的搜索路径
在你的my_package/__init__.py里添加一段代码,把someones_package的目录加到Python的模块搜索路径sys.path中:
import sys import os # 获取当前my_package目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接someones_package的路径并加入sys.path sys.path.append(os.path.join(current_dir, "someones_package"))
这样Python在执行file2.py里的import file1时,就会自动去someones_package目录里查找,自然能找到file1.py。这种方法不用改动第三方包的原代码,适合不想破坏原包结构的场景。
方法三:规范包结构,确保子包的导入合法性
首先确认someones_package目录下有没有__init__.py文件(Python3.3+支持无__init__.py的命名空间包,但加上它能让包结构更清晰,兼容性更好),然后在my_package/__init__.py里明确导出这个子包:
from . import someones_package
之后你在外部导入时,用from my_package import someones_package或者import my_package.someones_package,配合方法一的相对导入,整个包的结构就完全符合Python的包规范了,导入问题也能彻底解决。
额外小提示
测试的时候尽量避免直接在my_package目录下运行脚本,最好从my_package的上级目录执行导入操作,比如:
# 在my_package的上级目录运行这个脚本 import my_package.someones_package.file2
这样能避免工作目录干扰导入路径,减少不必要的问题。
内容的提问来源于stack exchange,提问作者user8483278




