写点什么

Python 包管理

用户头像
若尘
关注
发布于: 2021 年 05 月 12 日
Python 包管理

1. 模块

  • 一个模块就是一个包含 python 代码的文件,后缀名称是.py 就可以,模块就是个 python 文件

  • 为什么我们用模块

  • 程序太大,编写维护非常不方便,需要拆分

  • 模块可以增加代码重复利用的方法

  • 当作命名空间使用,避免命名冲突

  • 如何定义模块

  • 模块就是一个普通文件,所以任何代码可以直接书写

  • 不过根据模块的规范,最好在本块中编写以下内容

  • 函数(单一功能)

  • 类(相似功能的组合,或者类似业务模块)

  • 测试代码

  • 如何使用模块

  • 模块直接导入

  • 模块名称直接以数字开头,需要借助 importlib 帮助

  • 语法

  • import module_namemodule_name.function_namemodule_name.class_name

  • 案例 01.py,02.py,p01.py,p02.py


      # 案例 01.py    # 包含一个学生类    # 一个sayHello函数    # 一个打印语句      class Student():        def __init__(self, name = "NoName", age = 18):            self.name = name            self.age = age            def say(self):                print("My name is {0}".format(self.name))        def sayHello():        print("Hi, ")        print("我是模块p0")
复制代码


    # 案例 02.py    # 借助于importlib包可以实现导入以数字开头的模块名称    import importlib        # 相当于导入了一个叫01的模块并把导入模块赋值给了a        a = importlib.import_module("01")    stu = a.Student()    stu.say()
复制代码


    # 案例 p01.py    # 包含一个学生类    # 一个sayHello函数    # 一个打印语句        class Student():        def __init__(self, name = "NoName", age = 18):            self.name = name            self.age = age            def say(self):                print("My name is {0}".format(self.name))        def sayHello():        print("Hi, ")        # 此判断语句建议一直作为程序的入口    if __name__ == '__main__':        print("我是模块p01")
复制代码


    # 案例 p02.py    import p01        stu = p01.Student("xiaojing", 19)        stu.say()        p01.sayHello()
复制代码


    My name is xiaojing    Hi, - import 模块 as 别名    - 导入的同时给模块起一个别名    - 其余用法跟第一种相同    - 案例 p03.py
复制代码


      # 案例 p03.py    import p01 as p        stu = p.Student("yueyue", 18)    stu.say()
复制代码


    My name is yueyue- from module_name import func_name, class_name    - 按上述方法有选择性的导入    - 使用的时候可以直接使用导入的内容,不需要前缀    - 案例 p04
复制代码


      # 案例 p04.py    from p01 import Student, sayHello        stu = Student()        stu.say()        sayHello()
复制代码


    My name is NoName    Hi,    - from module_name import *    - 导入模块所有内容    - 案例 p05.py
复制代码


       # 案例 p05.py    from p01 import *        sayHello()        stu = Student("yaona", 20)    stu.say()
复制代码


    Hi,     My name is yaona
复制代码


  • if __name__ == ``__main__ 的使用

  • 可以有效的避免模块代码被导入的时候被动执行的问题

  • 建议所有程序的入口都以此代码为入口

2. 模块的搜索路径和存储

  • 什么是模块的搜索路径

  • 加载模块的时候,系统会在哪些地方寻找此模块

  • 系统默认的模块搜索路径


    # 案例 p06.py    import sys        print(type(sys.path))    print(sys.path)        for p in sys.path:        print(p)
复制代码


      <class 'list'>    ['D:\\python\\project\\包管理', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'D:\\python\\project', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\third_party\\thriftpy', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions', 'D:\\python\\project\\包管理', 'D:\\Anaconda3\\envs\\opp\\python37.zip', 'D:\\Anaconda3\\envs\\opp\\DLLs', 'D:\\Anaconda3\\envs\\opp\\lib', 'D:\\Anaconda3\\envs\\opp', 'D:\\Anaconda3\\envs\\opp\\lib\\site-packages']    D:\python\project\包管理    D:\PyCharm Community Edition 2019.1.1\helpers\pydev    D:\python\project    D:\PyCharm Community Edition 2019.1.1\helpers\third_party\thriftpy    D:\PyCharm Community Edition 2019.1.1\helpers\pydev    C:\Users\user\.PyCharmCE2019.1\system\cythonExtensions    D:\python\project\包管理    D:\Anaconda3\envs\opp\python37.zip    D:\Anaconda3\envs\opp\DLLs      D:\Anaconda3\envs\opp\lib    D:\Anaconda3\envs\opp    D:\Anaconda3\envs\opp\lib\site-packages
复制代码


  • 添加搜索路径

  • 模块的加载顺序

  • 搜索内存中已经加载好的模块

  • 搜索 python 的内置模块

  • 搜索 sys.path 路径

  • 包是一种组织管理代码的方式,包里面存放的是模块

  • 用于将模块包含在一起的文件夹就是包

  • 自定义包的结构

  • 包的导入操作

  • import package_name

  • 直接导入一个包,可以使用__init__.py 中的内容

  • 使用方式是:

  • 此种方式的访问内容是

  • 案例 pkg01, p07.py


    # pkg01.__init__py    def inInit():        print("I am in init of package")
# pkg01.p01.py class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi, ") print("我是模块p01")
复制代码


    # 案例 p07.py    import pkg01        pkg01.inInit()
复制代码


    I am in init of package  - import package_name as p    - 具体用法跟作用方式,跟上述简单导入一致    - 注意的是此种方法是默认对__init__.py内容的导入    - import package.module    - 导入包中某一个具体的模块    - 使用方法                package.module.func_name            package.module.class.fun()            package.module.class.var    - 案例 p08.py
复制代码


    # 案例 p08.py    import pkg01.p01        stu = pkg01.p01.Student()    stu.say()
复制代码


    我是模块p01    My name is NoName    - import package.module as pm
复制代码


  • from ... import 导入

  • from package import module1, module2, module3, ... ...

  • 此种导入方法不执行 __init__ 的内容

  • from package import *

  • 导入当前包 __init__.py 文件中所有的函数和类

  • 使用方法

  • 案例 p09.py, 注意此种导入的具体内容


    # 案例 p09.py    from pkg01 import *        inInit()        stu = Student() 
复制代码


    I am in init of package        NameError: name 'Student' is not defined
复制代码


  • from package.module import *

  • 导入包中指定的模块的所有内容

  • 使用方法

  • 在开发环境中经常会引用其他模块,可以在当前包中直接导入其他模块中的内容

  • import 完整的包或者模块的路径

  • __all__ 的用法

  • 在使用 from package import * 的时候,* 可以导入的内容

  • __init__.py 中如果文件为空,或者没有 __all__, 那么只可以把 __init__ 中的内容导入

  • __init__ 如果设置了 __all__ 的值,那么则按照 __all__ 指定的子包或者模块进行加载如此则不会载入 __init__ 中的内容

  • __all__=['module1', 'module2', 'package1'... ...]

  • 案例 pkg02,p10.py


    # pkg02.__init__.py    __all__=['p01']        def inInit():        print("T am in init of package")
# pkg02.p01.py class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi, ") # 此判断语句建议一直作为程序的入口 if __name__ == '__main__': print("我是模块p01")
复制代码


    # 案例 p10.py    from pkg02 import *        stu = p01.Student()    stu.say()
复制代码


  My name is NoName
复制代码

命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀

  • 作用是防止命名冲突

发布于: 2021 年 05 月 12 日阅读数: 10
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Python 包管理