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()

目录
相关文章
|
Python
Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
218 0
|
6月前
|
Unix iOS开发 MacOS
「Python系列」Python pip(包管理工具)、Anaconda介绍
Python pip是一个现代的、通用的Python包管理工具,用于查找、下载、安装、卸载Python包。它支持从PyPI(https://pypi.org/)、版本控制、本地项目以及直接从分发文件进行安装。pip是一个命令行程序,安装后,会向系统添加一个pip命令,该命令可以从命令提示符运行。
150 0
|
11月前
|
Ubuntu 前端开发 Linux
Python(四)开源的Python包管理器 anaconda——linux安装
首先,在ubuntu下,anaconda是没有图形化界面的,只能是命令行操作。 去官方网站下载他的ubuntu的安装包(x86) 访问官方网址下载:
108 0
|
Python
不同版本的Python,如何pip
不同版本的Python,如何pip
110 0
|
Java 数据库 C++
python介绍,以及所对应的(软件)安装
python介绍,以及所对应的(软件)安装
331 0
|
存储 开发框架 .NET
Python 包管理
Python 包管理
142 0
|
Shell Python
关于Python虚拟环境与包管理你应该知道的事
关于Python虚拟环境与包管理你应该知道的事Python拥有大量的第三方库,引用这些库也非常方便,通过pip install就可以将这些第三方库安装到本地Python库文件目录中,然后就可以import到项目中,极大地提升了开发者的编码效率。
3847 0
|
Python
Python第三方库安装技巧
pytho下有三种安装第三方库方法: 1、通过easy_install安装 2、通过Pip安装 前面两种,由于受国内部门网站原因,如果安装失败,可采用接下来的第三种方法 3、在指定网站下载安装 第三方库下载网站:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 查找指定下找包,如下载xpath第三方库模块(lxml)下载后,格式后,whl格式,将其重命名为zip格式解压后,将对应模块文件夹放置python安装目 录下的lib文件夹下即可。
2355 0
|
Python
Python之软件管理
常用软件包管理工具 一般python软件包管理工具,主要有以下:     图 常用python包管理工具 可以看到distribute是setuptools的替代方案(因为Setuptools包不再维护了),pip是easy_install的替代方案。
1401 0
|
Python Linux Windows
利用setuptools发布Python程序到PyPI,为Python添砖加瓦
pip install的东西从哪里来的? 从PyPI (Python Package Index)来的,官网是: https://pypi.python.org/pypi/执行pip install terminaltranslator命令的时候,它就会去从官方网站搜terminaltranslator,搜到了就下载压缩包并解压安装,如果没有搜索到就会报错。
3913 0