python的模块和包

拆出的 .py 文件就是一个模块
拆除的 目录 可能就是一个包

同级目录下可以直接引用 calc这个模块
此时calc和test在同一目录下

import calc
print(calc.add(10,20))
30

当我们将calc放到桌面上

import calc
print(calc.add(10,20))
Traceback (most recent call last):
  File "c:\Users\wyw15\Desktop\python代码\testpython_6\test.py", line 13, in <module>
    import calc
ModuleNotFoundError: No module named 'calc'
没有名为‘calc’的模块

修改:
sys python标准库自带的模块
一些和python解释器相关的设置选项

import sys
for line in sys.path:
    print(line)
输出:
c:\Users\wyw15\Desktop\python代码\testpython_6
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\python39.zip
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\DLLs
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib
C:\Users\wyw15\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFounda.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\site-packages
PS C:\Users\wyw15\Desktop\python代码\testpython_6> & C:/Users/wyw15/AppData/Local/Microsoft/WindowsApps/python3.9.exe c:/Users/wyw15/Desktop/python代码/testpython_6/test.py
c:\Users\wyw15\Desktop\python代码\testpython_6
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\python39.zip
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\DLLs
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib
C:\Users\wyw15\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0
C:\Users\wyw15\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages      
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0
C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\site-packages
第一个是这个文件所在的目录
其余的都是python所在安装的目录

我们能否将桌面加入到
sys python 里面是一大堆目录,这些目录
当我们执行import语句我们就在这些目录里面去找,
看有没有对应的python文件,如果找到就进行import
没找到就提示 模块未找到

现在我们的calc在桌面上,没在python目录下:
我们可以知道 sys.path 的类型 list
打印 sys.path 是一大堆路径,我们可以将桌面这个路径
添加到 sys.path 里面

import sys
sys.path.append(r'C:\Users\wyw15\Desktop')
# 这个路径里面的 \ 是转义字符,结果会出错,
# + r 将其变为原始字符串
import calc  # 这里的 calc虽然 下面会有 曲线,但是是不影响的
print(calc.add(10,20))

sys.path 完全是可以修改的,可以新增,也可以删除
但是不建议删除,可能会导致系统内部模块用不了


import语句

import语句导入模块, 可以一次import一个, 或者一次import多个

import os
import sys
或者
import os, sys # 使用 , 分割.

os.path 用来处理路径的操作

起别名
import os.path as op

还可以
我们知道模块是一个对象,所以,,,

import os.path
op = os.path

模块是一个对象

import os.path
print(type(os.path))
<class 'module'>

如果一个东西,你可以取出他的类型或者id
那么他就是一个对象


from-import 语句

1.import语句是直接导入一个模块.
而有时候我们只需要用到模块中的某一个或几个函数, 就可以使用fromimport
2.from-import相当于把模块中的名字引入了当前文件的命名空间中.

from os.path import exists
print(exists('test.py')) # 这个时候不需要敲 os.path 了.

3.可以使用 from module import * 的方式将module模块中的所有名字都导入进来.
但是不推荐这么用

from a import b
只导入a中的b
print(b('test.py'))
然后就可以直接使用b 而不用写 a.b

导入模块意味着 “被执行”

模块导入意味着这个模块 “被执行” ,
也就是说所有顶层的代码(无缩进部分的代码)都会被执行到.
这通常包括函数的定义和全局变量的定义

我们此处有两个Python文件: test.py和add.py
calc.py

print('hello')

test.py

import calc

执行结果
hello

这往往不是我们期望的结果(比如导入模块是打印了一些奇怪的日志),
我们只是想使用模块中的一些函数和变量.
因此往往我们在实现一个模块时,
只将函数定义/类定义放到顶层代码中

此时相当于将calc.py 中的所有代码都按照顺序执行了一遍
前面的def虽然没有直接输出,但还是执行了一遍
我们这里的导入模块(import),就是导入了一份二进制结果
这个二进制结果即:calc 这个文件编译执行一遍后,
把其中的二进制代码,再导入到test中,方便以后的调用

我们打开testpython_6
里面有 test 和 calc 和 pycache
打开__pycache__
出现 calc.cpython-39.pyc 这个文件
这就是我们刚才calc被导入之后,执行过程中,留下的二进制代码
把他留下来,后面导入时,直接用二进制就可以调用
而不是再在 calc这个文件进行整体执行一遍

python是解释执行,他是读一行语句,翻译执行,读一行,翻译执行
我们可以直接翻译完,把翻译的结果保存,第二遍直接执行就行
calc.cpython-39.pyc
这里的 pyc文件就是翻译完之后的结果。

我们也可以删除这个文件
当我们执行之后,这个文件又会回来
这是解释器自己创建的

当我们导入这个文件两次,是不是就是,这个打印会出来两次
import calc
import calc
hehe

这件事就和我们的动态库加载一样
我们可以加载一个动态库,加载几遍
实际上我们只加载了一遍


理解 “导入” 和 “加载”

1.我们写 import module 时, 其实有两个大的阶段,
先将这个模块的文件加载到内存中, 并创建一个对象来表示;
然后通过一个变量名来将这个模块引入到当前的命名空间中.
2.如果同一个模块(例如sys这样的常用模块)被import了多次,
其实加载动作只进行了一次(也就是说内存中只有一份sys的代码),
执行动作也只进行了一次

执行一个import语句本质上可以分为两个过程:加载,导入
加载:找到你那个对应的py文件,然后读取文件内容,
并且执行,在内存中得到一份二进制指令或者结果
导入:把你得到的二进制指令或结果,
例如这个二进制文件里面定义的变量,
把这些名字引入到当前文件里面


重新导入模块

python 2 中有
3中直接删除了

使用reload函数可以重新导入模块

calc.py
print('hello')
test.py
import calc
reload(calc)
执行结果
hello
hello

模块的内置变量

我们可以通过globals()函数看到全局命名空间下有几个内置变量

locals() 查看当前作用域下有哪些局部变量
globals() 查看当前作用域下所有的全局变量

print(globals())
{'__name__': '__main__', 
'__doc__': None, 
'__package__': None,
 '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000243AEB86CD0>, 
 '__spec__': None,
  '__annotations__': {},
   '__builtins__': <module 'builtins' (built-in)>, 
   '__file__': 'c:\\Users\\wyw15\\Desktop\\python代码\\testpython_6\\test.py',
    '__cached__': None}

可以看出是一个字典的结构
字典中有很多键值对,每一个键值对的键就是一个全局变量的名字
每一个值就是全局变量的值

name 表示当前模块的名字
main’ 是他的值
意思是:当前文件是你的入口文件
入口文件:我们执行python命令,后面跟上文件名来执行代码
你后面跟上的文件名是谁,这个文件就是入口文件

1.我们直接在test.py下面进行:

import calc 
print(calc.__name__)
calc

2.我们在calc.py下:
写:print(name)
我们在终端 下面写: python calc.py 然后 enter
输出:main

入口文件是谁?那个文件的__name__就是__main__
除此之外,模块名都叫自身名字

name 当前模块的名字
如果这个py文件时入口文件,name__的值就是__main
如果这个 py 文件不是入口文件,__name__的值就是当前文件名不算后缀部分

用处:
清除calc.py中杂余代码
写下:。。。(转到 calc文件)

import calc
print(calc.__name__)
calc

此时calc中的一些代码就不会执行到(新添加的条件语句)


包(Package)

当我们代码量进一步变大时, 光拆分成多个文件已经不足以满足需求,
还需要能按照一定的目录结构层次化的组织这些模块.
同时包也可以解决模块之间的名字冲突问题

我们在testpython_6里面再建一个文件mymath
然后将calc.py 这个文件移进去
将__pycache__ 这个缓存文件删除掉

此时,我们的test.py 的同级目录就叫mymath
mymath里面有一个calc.py

此时我们能否直接调用 calc这个文件?

import calc
 ModuleNotFoundError: No module named 'calc'

import mymath.calc
执行没问题

import mymath
也没问题

通过这样的方式,我们用目录将之变为包
目录是包组织的一种方式

我们上面是直接写一个目录,
更严格的方式:
我们应在 mymath里面新加一份文件
init.py
这个文件的功能是
对一个包进行初始化

import mymath.calc
print(mymath.calc.add(10,20))
# 30

在这个代码里面,我们的__init__看起来好像没什么效果
但是他已经被执行了,

我们在__init__.py 里面加入:

print('初始化 mymath 包')
然后:
import mymath.calc
print(mymath.calc.add(10,20))
初始化 mymath 包
30

python 2 里面如果没有 init.py 就会直接报错
python 3 中这个可写可不写,
但是建议写上,有些开发工具可能不会识别,导致一些问题

我们说模块导入python文件,包是进入到目录,但实际上
我们会将这两个概念混淆使用

import mymath
print(type(mymath))
<class 'module'>

pip 命令:
包管理器

我们的包可以自己写,也可以标准库
我们还需要第三方模块,
第三方模块如何安装?
pip install 库名
只需要知道第三方库的名字,
前提网络通畅

python cookbook
给你一个场景,如何用库解决这个场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值