ModuleNotFoundError:同目录与父目录模块导入方式的不同&import 机制详解

ModuleNotFoundError:同目录与父目录模块导入方式的不同&import 机制详解_第1张图片
ModuleNotFoundError:同目录与父目录模块导入方式的不同&import 机制详解_第2张图片
ModuleNotFoundError:同目录与父目录模块导入方式的不同&import 机制详解_第3张图片
上面三个图,都是在main.py文件中执行,前两个是由于在Functions.py文件中import config导致,因为config.py与Functions.py都是在program包下面的模块,与main.py不在同一目录,需要用到from program import config。但是Signals.py与main.py在同一级目录下,所以在main.py中直接import Signals是没有问题的。

config.py与Functions.py虽然也是在同一级目录,但这个文件是在main.py中执行,也就是说config.py与main.py不同目录,如果在Functions.py中执行,那直接import config是正确的。

模块(module):一个可以实现独立功能,包含定义的函数和变量的文件,后缀是".py"、".pyo"、".pyc"、".pyd"、".dll",为了重复使用而存在。

模块分为内建模块(通过dir(_builtins_)查看)和非内建模块(需要被import)。

若要使用模块,需要*import module_name*语句,也是python标准库(很多模块的集合)的使用方法。

是一种管理 Python 模块命名空间的形式,采用"点模块名称“,一种有层次结构的文件目录。目录中包含子包和模块,且必须有一个叫做 _init_.py (包的初始化文件)的文件。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B

  • import item 官方文档

  1. import module_name

当解释器遇到*import*语句,如果模块在当前的搜索路径就会被导入,一个模块只会被导入一次。。

搜索路径是一个解释器会先进行搜索的所有目录的列表。

搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。其实搜索路径就是环境变量里的路径。搜索顺序就是按照其顺序依次查找的。我们可以把sys.path环境变量打印出来,可以看到第一个路径是空,代表当前路径,说明当前路径的优先级最高。在实际开发中,我们可以根据自己的需求给这个路径动态的增加自己需要的路径。

这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。

搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量。

在导入模块时。模块所在文件夹将自动生成一个对应的**_pycache_\module_name.cpython-36.pyc**文件。

这种方法相当于在当前代码中创建了一个module对象,而module.py中的变量和函数相当于是module对象的属性和方法。我们可以通过module.属性名module.方法名()调用模块中的内容。

  1. import package_name

导入包的本质是执行包下面的_init_.py文件。

执行结束后会包名的目录下生成一个"__pycache__/_init.cpython-36.pyc" 文件。

  1. import package1.package2.module

最后一个item必须是module。

  • from…import 菜鸟教程

  1. from module_name import function_name

从模块中导入一个指定的部分到当前命名空间,如**模块中的xx函数。

方法相当于是把module.py中的代码导入到了当前环境。我们可以直接用module模块中的变量和方法

  1. from module_name import *

从一个模块中导入全部内容

  1. from package_name import item

从一个包中导入某个item(子包、模块、函数、类、变量)。

  • sys.modules存放所有被加载到内存中的模块

执行import时会首先去sys.modules中查询是否已经添加,如果已经在sys.modules中,那就简单了,只需要将该module的name添加到我们正在调用该module的本地空间中。如果还没有放在sys.modules中,就需要在sys.path所有路径的目录中去按顺序查找该模块的文件,这些文件一般后缀为".py"、".pyo"、".pyc"、".pyd"、".dll",找到这些模块后就可以将这些模块添加到sys.modules中,再将module name导入到本地。

  • 参考

梧桐深院

2018.11.20 写于德州乐陵

你可能感兴趣的:(Error,小白学Python)