先插入模块/包是怎么找的 #

先找当前的包找有没有,没有去安装目录的内置函数中,再没有看看你设置的系统环境变量有没有 一般情况,代码添加的环境变量只存在当前窗口,关闭就没了-

正题 #

  1. python 中模块是包含变量、函数等的文件;只要是你想引用的文件都叫模块

  2. 包是存放多个文件/模块的文件夹,可以** 统一组织和管理 **多个 python 模块

  3. 包结构中包含一个特殊的文件[init.py]。

两者的区别:包是一个文件夹,可以存放多个文件/模块, 模块是一个文件。 模块可以放在包,也可以放在目录,而放在包的作用是(见上见下)


在引入 Package 中的模块时 from xx import xx 和 import xx,而**使用后者时还要确保 **init**.py 文件中个导入了模块**; #

在引入 Directory 中内容时,只可以引入该目录的子目录中的内容,也可以在目录中添加**init**.py 使之可以**像包一样引用** #


而使用 import xx(特别注意,这里的 xx 是包名!)时还要确保**init**.py 文件中个导入了模块 #

这个再详细说明 做为包,你可以选择 import 和 from 前者引用全部,后者可以选择包中的子模块,而当引用全部却没有在init.py 写子模块的位置就会报错,例如: import pay #引用 pay 这个包 pay.alipay.tools.pay2()# 再使用 pay 包当前目录的 alipay 文件夹里的 tools.py 里的 pay2 方法

会报错

module 'pay' has no attribute 'alipay' #

报错是因为导入包,实际是导入包的 init.py

那为什么 from pay.alipay.tools import pay2 可以?? #

A:因为这种方式已经明确了路径了啊,或者见下面对于单文件和目录的说法吧~

直接 import pay 对的就是 pay 下的init.py 这个很关键,而当你使用包里的子模块或者方法的时候必须在init.py 写明位置,不然读取不了

如何修复? #

一般下init.py 都是空的,要去写 pay 下的init.py 加 from . import alipay

同样在 alipay 文件下的init.py 填 from .tools import pay2, get_status //注意这里 import 可以逗号形式写

. 是什么呢?可以说.就是当前目录,也就是前面我非要在前面别扭地打出当前目录

说到这里,可能又发现-

那为什么 from pay.alipay.tools import pay 这个 pay 前面没有. 因为这种直接明确地址的是在项目的根目录开始找起,不需要添加,添加反而出错

这里要区分开,就是在** init.py 引用要加当前目录 ** from . import alipay 意思是 pay 下作为当前目录,找 pay 里的 alipay

好,说到这里你可以有点糊涂了,没事,先冷静下

引用单个文件的时候,写的 import 就得麻烦了 1.from 的写法 假设 a 文件夹里的 b 文件夹有 c.py 我们引用的时候得这样写 from a.b import c 这意思是占用的父文件夹 a 当前目录(.)下的 b,b 文件夹的 c.py 2.import c,至于怎么找,看最上面的插入吧 这里要跟包区分,因为包的 import 是文件夹的/包的名称,而这里就是 c.py,因此直接指向 c.py,而包名指向init.py

包可以选择两种方法,from 更能选择包里的子包。

这里继续说到上面的遗留问题

from pay.alipay.tools import pay2

对于上面来说,没有加.是因为从根目录上找,pay 却是 a 文件夹的,那为什么这里又把 a.b 写上,而不写 b 呢, 1.这是单个文件,或者说是目录的文件,不是包 2.在引入 Directory 中内容时,只可以引入该目录的子目录中的内容,在上面谈到了。因为如果直接写 b,它会认为是一个包,但是却没有init.py,所以说这里得 b 弄成子目录,否则不能引用 b 文件夹的 c.py,也就说引用模块,from 必须的是子目录 ,写出子目录,即使是包,也得指向 from pay.tools pay 的 tools.py 没有直接指向 pay。或者说只写一个,先认为你是一个模块,而不是目录。也就是最后一个 tool 和第一个必须是模块,而不是目录…… 只写一个目录,还不如直接当包直接 import

其实,还有个最最不会出错的方法就是…… 写好包,先不引用,写好部分代码,让 pycharm 给你自动修复引用