对于这种特殊情况,双重导入警告是由于proj / __ init__.py中的这一行:
from .proj import main
该行的含义是,当-m开关实现完成导入项目步骤时,proj.proj已被导入,作为导入父包的副作用.
避免警告
要避免警告,您需要找到一种方法来确保导入父包不会隐式导入使用-m开关执行的包.
解决这两个问题的两个主要选择是:
>删除.proj导入主线(如@John Moutafis建议的那样),假设可以在不破坏API兼容性保证的情况下完成;要么
>从proj子模块中删除if __name__ ==“__ main__”:块并将其替换为一个单独的proj / __ main__.py文件:
from .proj import main
main()
如果使用选项2,那么命令行调用也将更改为python -m proj,而不是引用子模块.
选项2的更向后兼容的变体是添加__main__.py而不从当前子模块中删除CLI块,并且当与DeprecationWarning结合时,这可能是一种特别好的方法:
if __name__ == "__main__":
import warnings
warnings.warn("use 'python -m proj', not 'python -m proj.proj'", DeprecationWarning)
main()
如果proj / __ main__.py已经被用于其他目的,那么你也可以用python -m proj.proj_cli替换python -m proj.proj,其中proj / proj_cli.py如下所示:
<