python_module

python 包,模块。

  • 包 即目录(可以含有__init__.py,有则是regularpackage,没有则是namespacepackage)。 包名即目录名。 调用包里的模块。 包名.xx中的xx是目录下的 模块/.py文件。
  • 模块 即.py文件。模块名即文件名(不带.py)。 调用模块里的东西 模块名.xx xx可以是.py文件中的类 函数 变量等。

import 导入模块或导入模块中的某个东东。两种写法。

  • import xxx 导入模块。 (xxx查找路径 系统目录以及当前目录 或 xxx指定的 如 AA.BB.bb)。 只能导入整个模块, 要想导入模块中的某个用from。
  • from XXX import YYY 导入模块或导入模块中的东东。 从XXX模块中导入YYY(具体的类 函数 变量)。 或 从XXX包中导入模块YYY。 (XXX查找路径 系统目录以及当前目录或XXX指定的如../../ABC,不能直接指定,要sys.append)

import 绝对导入 和 相对导入(使用.和..和…等。相对导入只能用在from形式,即有.或..只能用在from。直接import .XXX是不行)(在顶级包下无法使用相对导入,即无法使用from ./../…等相对导入的形式。或者说相对导入无法..到顶级包。 顶级包 就是python命令运行时那个py文件所在的目录为顶级目录)。(绝对路径,相对路径)
(绝对是python命令执行时所在的目录为根目录,即以顶级包所在目录为根目录的。 相对是当前py文件的所在目录。)
一般相对导入(. ..)只用在有包的情况下。

pyhton2之前 默认/隐式 为相对导入, python3为绝对导入。

  • python3绝对导入2种: from import, import。 相对导入(.或..) from import。
  • python2绝对导入2种: from import,import(eg:import AA.BB.aa)。 相对导入 from import, import(只是import xxx默认为相对的 <=> from . import xxx) .
    (涉及. .. 只能用from形式)

非常简单暴力的方法,将搜索路径 加入到sys中, sys.append。

绝对导入时的模块寻找路径:
python模块的搜索目录有下面四个部分组成
1:python命令执行时的所在目录。
2:环境变量PYTHONPATH中列出的目录
通过设置该系统环境变量,可以指定python的额外搜索目录
3:python标准库目录
python的标准库
4:python的.pth文件扩展额外的搜索目录
该文件提供了一种扩展搜索目录的方式。在该文件中每一行表示一个扩展目录
python程序在启动时按照上面的顺序依次依次合并起来称为python的库文件查找路径集合。所以当python在查找某一个模块时,首先查找home目录然后PYTHONPATH目录,然后标准库,然后.pth文件中提供的目录。
python的模块搜索路径列表存放在sys.path变量总,可以通过输出该变量来查看当前模块搜索列表。也可以通过改改变该变量的值来动态修改python的搜索路径。

相对导入时的模块寻找路径,就是相对导入的路径去寻找。 (相对导入 是相对当前.py文件所在目录)

(相对导入时如果要找上顶级包上一层的模块,可以上层路径加到sys路径中,作为绝对导入形式导入。)

python import 引用导致的循环导入。

  • import过程 实际上是栈的形式。 A 中import B , 在import处,暂停A的执行,去执行导入的文件B,导入文件B执行完之后,返回到A中的import点,A从import点处继续往下执行。

解决import错误。

  • ValueError: attempted relative import beyond top-level package # 试图在顶级包(top-level package)之外进行相对导入
  • ImportError: attempted relative import with no known parent package. 在顶级包中无法用相对导入。
  • ModuleNotFoundError: No module named ‘moduleY’ 找不到moduel。 解决方法,看绝对 还是 相对,然后去看看寻找路径中有没有该module。

如果你想在顶级包下使用顶级包上层的模块,那么可以将上层模块加入到sys路径中。然后以绝对导入方式直接import。