Skip to content

Latest commit

 

History

History
267 lines (179 loc) · 5.72 KB

208-532715-设置类库目录_sys_path.sy.md

File metadata and controls

267 lines (179 loc) · 5.72 KB
show version enable_checker
step
1.0
true

自定义模块文档(pydoc)

回忆

  • 上次研究了文档
  • 模块本身有三种对象
    • 模块
    • 变量
    • 函数

图片描述

  • 可以用三引号来写文档
  • 文档被写在__doc__这个字符串类型的属性里面
  • 可以用help和网页的方式查看
  • 模块的位置位于/usr/lib/python3.8/等目录下面
  • 到底哪些路径是python类库的路径呢?

类库目录

import sys
print(sys.path)
  • 执行结果

图片描述

具体观察

  • 这些文件被导入的时候
    • 会先被编译为pyc文件
    • 也就是python虚拟机
    • 直接可运行的指令文件

图片描述

  • 然后放在 /usr/lib/python3.8/__pycache__ 这个目录里面

图片描述

以模块方式运行

  • 以m(odule) 的方式运行 distro
python3 -m distro
  • 结果看起来
    • 输出了当前系统的
    • 发行版细节
    • distro(bution)

图片描述

  • 这distro模块 在哪呢?

引入新包

import distro
print(distro)
print(id(distro))
print(type(distro))
  • 运行结果

图片描述

  • 这路径在sys.path中吗?

图片描述

  • 路径在
    • 系统的python路径下
  • 可以打开这个 distro.py看看嘛?

distro

vi /usr/lib/python3/dist-packages/distro.py
  • 看起来有比较 明确的注释

图片描述

  • 这个distro.py是如何执行的呢?

查找 __main__

  • / __main__
    • 查找 __main__

图片描述

  • 找到1215中

    • 条件判断
    • 如果 当前的模块 是主模块
    • 就调用 main()
  • 在main()上 依次按下

    • gd
    • go to definition

跳转

  • 跳转到main函数定义的位置
    • 通过这个函数
    • 可以得到当前系统的发行版

图片描述

  • 这个目录下面除了
    • distro.py
    • 还有什么呢?

观察文件

  • 也有不少的python文件

图片描述

  • 那么python的类库目录至少就有两个了
  • 类库目录列表怎么查询来着?

sys.path

  • 这个变量里面存的就是系统(system)的路径(path)

图片描述

  • 这个对象是一个列表
    • 列表中就是
      • 查找类库的路径
      • 也可以是zip包
  • 如果将变量清空了会如何???

清空类库路径

  • 清空类库路径列表
    • 就无法引入任何模块了
    • 因为找不到了

图片描述

  • 如何理解sys.path?

导入模块(module)过程

图片描述

  • 面对一个需要导入的模块的名字
    1. 先查找这个模块是否是内置模块
    2. 去sys.path中去查找

图片描述

  • 那sys.path中的路径来自于什么呢?
    1. 需要用python运行的目录
    2. 系统环境变量$PYTHONPATH
    3. 默认的一系列类库目录
  • 我们去试试

设置类库

图片描述

  • 想引用一个o2z.py
  • 但是找不到

写一个

echo "print(\"i am o2z\")" > ~/Code/o2z.py
  • 将"print("i am o2z")" 输出重定向
    • 录入 o2z.py
export  PYTHONPATH=/home/shiyanlou/Code
  • 将 系统变量PYTHONPATH
    • 设置为/home/shiyanlou/Code
    • 这样 oeasy.py 就可以
    • 找到 o2z
    • 并且 import o2z 了

图片描述

  • 设置路径后
  • 在oeasy.py中
    • 成功引用o2z.py
  • 那 我能覆盖原来的类库 么?

覆盖原始类库

  • python会在列表路径中依次寻找相关模块
    • 一旦找到了后面就不找了

图片描述

  • 如果红色路径中
    • 找到random.py
    • 就不会去蓝色路径中查找了
    • 随机函数也就不随机了?!

尝试

print("this is oeasy's random.py")
def randint():
    print("in oeasy random.randint")
    return 0
  • 构造random.py

图片描述

  • 保存之后 进入游乐场

倒入 random

import random
random.randint()
  • 导入的时候
    • 提醒我们进入了 自己的random.py

图片描述

  • 随机函数就不随机了

图片描述

总结

  • 这次研究了python类库的来源
    • 系统内置
    • 类库目录
  • 把py程序放到python类库列表中
    • py程序就成一个类库包
      • 可以直接运行此程序
      • 也可以作为类库导入次程序

图片描述

  • 那我怎么知道 当前的py文件
    • 是 引入的模块
    • 还是 主控的程序 呢🤔
  • 我们下次再说👋