Python 包管理

简介: Python 包管理

1. 模块

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

    • 程序太大,编写维护非常不方便,需要拆分
    • 模块可以增加代码重复利用的方法
    • 当作命名空间使用,避免命名冲突
  • 如何定义模块

    • 模块就是一个普通文件,所以任何代码可以直接书写
    • 不过根据模块的规范,最好在本块中编写以下内容

      - 函数(单一功能)
      - 类(相似功能的组合,或者类似业务模块)
      - 测试代码
      
  • 如何使用模块

    • 模块直接导入

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

      import module_name
      module_name.function_name
      module_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. 模块的搜索路径和存储

  • 什么是模块的搜索路径

    • 加载模块的时候,系统会在哪些地方寻找此模块
  • 系统默认的模块搜索路径

    import sys
    sys.path  属性可以获取路径列表
    # 案例 p06.py
    
        # 案例 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
    
  • 添加搜索路径

    sys.path.append(dir)
  • 模块的加载顺序

    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

  • 包是一种组织管理代码的方式,包里面存放的是模块
  • 用于将模块包含在一起的文件夹就是包
  • 自定义包的结构
    |---包
    |---|---  __init__.py  包的标志文件
    |---|---  模块1
    |---|---  模块2
    |---|---  子包(子文件夹)
    |---|---|---  __init__.py
    |---|---|---  子包模块1
    |---|---|---  子包模块2
    
  • 包的导入操作

    • import package_name

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

        package_name.func_name
        package_name.class_name.func_name()

      • 此种方式的访问内容是
      • 案例 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 pkg01 import p01
      p01.sayHello()
    • from package import *

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

        func_name()
        class_name.func_name()
        class_name.var

      • 案例 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 *

    • 导入包中指定的模块的所有内容
    • 使用方法

      func_name()
      class_name.func_name()

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

    • 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

命名空间

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

    setName()
    Student.setName()
    Dog.setName()

目录
相关文章
|
29天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
45 4
|
28天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
28天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
3月前
|
Python
下载python所有的包 国内地址
下载python所有的包 国内地址
|
21天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
28 5
|
29天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
39 5
|
28天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
WK
|
4月前
|
Python
如何在Python中导入包
在 Python 中,包是一种组织代码的方式,通过包含 `__init__.py` 文件(在 Python 3.3 及以上版本可选)的目录实现。包内可以包含多个模块(`.py` 文件)和其他子包。导入包有多种方式:整体导入包、导入特定模块、导入特定函数或类、导入子包等。推荐的做法是明确指定导入内容以提高代码的可读性和可维护性。此外,确保包目录结构正确,并将其添加到 Python 的搜索路径中。对于分发包,使用 setuptools 和 pip 等工具更为便捷。
WK
134 66
WK
|
4月前
|
Python
如何在Python中创建包
在Python中创建包十分简便,主要涉及目录结构的设置及`__init__.py`文件的配置。虽然Python 3.3后空`__init__.py`文件不再强制要求,但在特定场景下保留它有助于保持兼容性或执行包初始化代码。创建包的具体步骤包括:构建目录结构、编写模块代码、(可选)编写初始化代码等。例如,可以创建一个名为`mypackage`的目录,其中包含`__init__.py`及多个模块文件如
WK
122 62
|
3月前
|
机器学习/深度学习 搜索推荐 数据可视化
Python量化炒股常用的Matplotlib包
Python量化炒股常用的Matplotlib包
39 7