语无伦次快速记录关于python包的导入

语无伦次快速记录关于python包的导入

注意用IDE(pycharm等)可能会模糊这个问题,因为IDE“偷偷”给加了好多东西,建议直接命令行python xxx.py

/FOLDER
|--------------A(folder)
                  |----------__init__.py
                  |----------a1.py
                  |----------等其他文件
|--------------B(folder)
                  |----------__init__.py
                  |----------BB1(folder)
                                    |----------BBB1(folder)
                                   					 |----------__init__.pyxxx.py
                                   					 |----------bbb11.py
                                    |----------__init__.py
					                |----------bb11.py
					                |----------等其他文件
			      |----------BB2(folder)
                                    |----------__init__.py
					                 |----------bb21.py
					                 |----------等其他文件
                  |----------b1.py
                  |----------等其他文件
|--------------main.py

绝对导入:

比如 from B.BB1.BBB1.bbb11 import xx, 根据python包的寻找规则,sys.path里要存在这个包所在的路径,对于这个例子即文件夹B所在的路径(即/FOLDER,不是B的内容包含的路径),若是符合python推荐的文件设计方法,即最外层留一个入口文件,那么入口文件里写绝对导入是没有问题的,因为入口文件所在的目录就是同一级包所在的目录(python解释器会自动将运行的这个文件所在的目录加进sys.path),比如main.py,

但是若要从里面的文件import外面的文件内容,(若是入口文件还是最外面的main.py,那么里面文件引用外面的可以使用相对导入,或者绝对导入,都没有问题),在入口文件就是里面文件的前提下,这就比较麻烦,比如我就要运行bbb11.py,有一种方法是可以使用python -m,这里暂时不谈,我用的绝对引用,就是想运行它,怎么办呢?(若是用的相对引用没辙了只能使用python -m了)那么根据前面说的,包要添加到sys.path里,

比如我这里的bbb11.py,用到了bb11.py的东西,

  • 若写的是from BB1.bb11 import xx ,那么就要保证BB1文件夹所在的路径在sys.path里,bbb11.py里可以写sys.path.append('/FOLDER/B/'),或者:

    • 若执行这个py程序的路径在/FOLDER/B/BB1/BBB1,(即可以直接运行python bbb11.py),那么bbb11.py里可以写sys.path.append('../..')(即它的上上级目录,这里的写法不是多个点,要注意,有点坑,同理../../../../等,但是相对导入的是多个点,比如from ....utils import xxx),
    • 若执行这个py程序的路径在/FOLDER/B/BB1/, (即需要运行python BBB1/bbb11.py),那么bbb11.py里可以写sys.path.append('..'),之加入它的父目录即可,所以说这里面的点所代表的意思,是和python运行时候的运行路径有关系的,并不是python文件所在的路径!
    • 同理,若执行这个py程序的路径在/FOLDER/B/, (即需要运行python BB1/BBB1/bbb11.py),那么bbb11.py里可以写sys.path.append('.')
  • 若写的是from B.BB1.bb11 import xx ,这里最开始的文件夹是B,那么sys.path里面要加入B所在的路径,即/FOLDER,sys.path.append里面不同的运行路径怎么写,可以根据前面写的类推下就不写了

有一种比较固定的方法,不用根据运行路径考虑那么多点:https://blog.csdn.net/lvxiaoting/article/details/80309190


还有sys.path的insert(0,*)和append区别,要是这个模块和内置模块等重复了,那么用append放到后面会有问题,insert到前面可以运行自己的模块(当然我这里写的情况都是垃圾的设计,但是可以希望借此加深理解吧)


再写一下相对导入常见的问题,“ValueError: attempted relative import beyond top-level package”,当前目录(即使有__init__.py)不会被当做package,所以不能进行相对导入,简单理解就是相对导入不能绕过项目入口所在的目录,这里面例子很好:https://blog.csdn.net/u011519550/article/details/104732765/,
(即文件夹被python解释器视作package需要满足两个条件:1、文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。2、不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。)


其余的问题看我之前转载那几篇就ok,写的很清楚了,这篇文章就再语无伦次补充几句。
link:
https://blog.csdn.net/bat67/article/details/108438634
https://blog.csdn.net/bat67/article/details/108442633


再附点link吧,有的之前转载过

  • https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944
  • https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3
  • https://zhuanlan.zhihu.com/p/109036573
  • https://www.jianshu.com/p/6bc26b3ba6e5
  • https://zhuanlan.zhihu.com/p/63143493
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值