从全流程的角度来了解python包的使用,也许你会有不一样的认识

在python中,只要我们一谈到包或模块,基本默认说的就是包的导入和使用。也就是说只要我们知道包的名字,导入后知道怎么使用基本就可以了,但本人认为,我们仅仅了解的是包的一部分,若想对包有个整体的认识,我们还需知道包的整个制作和使用流程。

在这里插入图片描述

在这个圆环流程图中,其实并没有严格的前后顺序,你也可以先进行包的开发、制作、上传、下载、安装,最后再到包的导入和使用,同样也可以直接导入现成包直接使用 。那么接下来我们就从最基本的包开始介绍 。

1.模块和包(包的导入和使用)

谈到包,你就不得不知道模块 ,因为很多包就是由模块构成的 。所以,接下来我们就来了解下python中的模块 。

1.1 模块

1.什么是模块

所谓的模块,其实就是一个python ,以.py结尾的文件 ,文件内包含了类、函数、方法等 。

myproject
├─ __init__.py
├─ abc.py
└─ bcd.py

其中,abc和bcd就是python的模块 ,后续模块的导入和使用也是直接这两个名字即可 。

在python中,有很多现成的模块是可以直接使用的,比如os模块 。若使用其功能时只需要完成两步即可,分别是:

  1. 模块的导入
  2. 模块内函数、函数、类的调用

2.模块的分类

python中的模块,我们可以将其分为三类,分别是:

  • 系统自带模块 ,相当于安装python包就将这些模块自动安装上了,这一类型的模块在python的整个环境中全局有效,任何地方都可导入直接使用 。其中典型的模块以os为主 .
  • 第三方模块/包 ,使用时需要先下载安装并配置环境变量,在配置的环境变量内模块可以被导入使用 。这一类型的包或模块是我们最常用的,因为大多数情况下,系统模块都不能满足我们的需求 ,需要借助于大量的第三方模块/包才能完成工作 。
  • 自定义模块 ,项目内部开发的模块 ,可以在项目内部使用 ,超出项目内即无法使用 。

3.模块导入

在上面我们已经介绍到,若想要使用现成的模块,第一个步骤就是导入,在python中导入有两种方法,分别是:

# 第一种导入方式:
import 模块名# 需求1:导入os模块 
import os# 需求2 :导入自己编写的模块,abc  注意 : 导入自己编写的模块时需要注意路径 。
import abc # 说明: 通过这种方式导入的模块,使用时也需要加入模块的名字 ,比如os模块内有个getcwd()方法,在使用这个方法时,也必须是os.getcwd()才行 。

使用上面的导入方式有一定的弊端,比如说os内部有很多方法,但我只是使用其中的几个方法,但是通过import os导入后将os内所有方法和类全部导入,占用系统资源较大 ;其次就是每次使用具体方法或类时,必须前面加模块名 ,调用起来不太便捷 。以上的这些问题该如何解决呢 ?答案就是使用第二种导入方式 :from 模块 import 方法|类

# 第二种导入方式
from 模块名 import 成员名 # 导入 os里的getcwd方法
from os import getcwd# 说明 :通过这种方式导入后 ,使用getcwd()方法时直接调用getcwd即可。

在这里插入图片描述

4.模块路径搜索

无论是后面介绍的包,还是这里要介绍的模块,直接进行了导入操作 ,它就会先去找到这个模块/包 ,如果在指定的路径下搜索该模块,如果找到,则导入成功 ,否则导入失败 。具体搜索的先后顺序依次为:

  • 程序的当前路径
  • python的环境变量路径
  • python标准链接库路径

以上的路径组合起来就是sys.path所包含的路径 ,而python会选择在搜素路径中的第一个符合导入文件名的文件作为导入模块,找到后即停止后面的搜索 。所以若你自定义的模块和其它路径下的模块重名,你又想要用到自定义模块,就可以把自定义模块放在前面 。

同时还需要注意的是,自定义模块不能和系统模块重名,否则会报错 。在这里插入图片描述

1.2 包

1.什么是包

包是一个包含多个模块的特殊目录,目录里有文件和目录的组合 ,其目录下有一个特殊文件__init__.py,这也是包和目录的最主要区别 。

myproject
├─ __init__.py
├─ mypack01├─ __init__.py
├─ mydir
├─ ab.py
└─ bc.py# 说明:. 其中myproject就是最外层的包 ,其中每个包下都会有个__init__.py的文件,这也是区别普通目录和包的最主要区别 。其中__init__.py中可以是空也可以有python代码 。
② . mypack01是子包 ,mydir是目录
③ . ab.py和bc.py是包下的模块

其中包和模块的使用方式一样,同样需要先导入后调用(使用 ),这里就不再赘述。在这里插入图片描述
2.__init__介绍

这里需要介绍下__init__这个特殊的文件,我们都知道它这个里面可以写代码,也可以不写 ?但是很多情况下我们并不知道,这个文件中到底该写什么代码 ?这个文件到底有什么作用呢 ?我们通过几段代码来展示它的作用 。

先看下俩个模块(ab.py和bc.py)内的代码,

# 文件:ab.pydef div(a,b):return a // bdef mul(a,b):return a * b
# 文件 : bc.pydef add(a,b):return a + bdef min(a,b):return a - b

如果我想在test.py中调用以上俩个文件中的函数,可以是如下的写法 :

import mypack01.ab
import mypack01.bcprint(mypack01.ab.mul(3,4))		#输出:12
print(mypack01.bc.add(3,4))     #输出 :7

通过以上的导入方法可以看到,能得到正确的结果 。接下来我们做个试验 ,导入时只写父包名 ,不写子包名 。具体如下图 :在这里插入图片描述
只导入父包名就会报错 ,当鼠标移动到ab或bc上时, 提示了一句Cannot find reference 'bc' in __init__.py , 大体意思是在__init__.py中找不到bc . 于是我们在__init__.py中把这个模块导入 ,具体代码如下:

# mypack01包下的__init__.py import mypack01.bc
import mypack01.ab
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6dd1eecee4a1435f8a56591636a7de99.png)以上的俩个截图可以看到,test.py文件中的代码没变,而所变化的就是\_\_init\_\_.py . 那么这时\_\_init\_\_.py 到底起到了什么作用呢 ?结合着上面的提示 ,我们可以总结出:**在其它模块import后跟包名,其实导入的是init.py文件**,也就是说只要你的代码导入其它包时,就会自动执行导入包下的\_\_init\_\_.py代码 。那么,以上的结论在实际场景中到底有什么作用呢 ? 通过以上的代码肯定是看不出来  ,我们可以想象一种场景, 假设我们有很多模块都要调用mypack01中的几个函数 ,是不是要在每个模块都要写几个导入语句啊 ,这个时候我们就可以将导入语句写到\_\_init\_\_.py代码中,这样是不是就节省了一部分代码呢 ? 这种场景不正是很多模块调用公共类库时会遇到的情形吗 ,所以 ,就可以使用\_\_init\_\_.py进行初始化一些导入 。还有另外一种情况,可以用于**from package import * **  , 这个*代表要把package包内的所有模块统统导入 。但有时候我们不希望部分模块被都导入 ,因为部分模块只是被内部使用的,若被其它模块导入后,那就变为公共资源了 。这个时候怎么控制呢 ?答案就是在\_\_init\_\_.py中加入一个\_\_all\_\_变量列表 。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/66623cffb6b14620bb22ffa73f45927b.png)## 2.包的制作与上传有时候我们开发的包也想供外界使用,你就可以把你的原始包制作成可供pip或者easy_install安装的包 。具体制作步骤如下:1. 在包对应的项目下创建必要的文件 ,分别为setup.py,LICENSE,README.md .![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d4cefb6a2dc24b7f9f741e81bafa7821.png)
1. 编写readme.md文件和setup.py脚本 。编写自己的README.md文件```md## 包功能说明### 1.包功能介绍### 2.安装方法### 3.参数说明### 4.联系方式

编写自己的setup.py

import os
import setuptools# 读取readme文件
with open("README.md", "r",encoding='utf-8') as f:readme = f.read()setuptools.setup(name="mypack",  #包名称version="0.0.1",    #版本author="Example Author",    #包邮箱author_email="author@example.com",  #作者邮箱description="A small example package",   #包描述long_description=readme,        #长描述,通常是readme ,打包到PiPy需要 。url="https://github.com/pypa/sampleproject",        #项目URLpackages=setuptools.find_packages(),            #项目中需要的包classifiers=[               #程序的所属分类列表'Operating System :: Microsoft','Operating System :: POSIX','Operating System :: Unix','Topic :: NLP','Topic :: Software Development :: Libraries :: Python Modules','Programming Language :: Python :: 3.5','Programming Language :: Python :: 3.6','Programming Language :: Python :: 3.7','Programming Language :: Python :: 3.8',],
)
  1. 进行打包 ,其中最常见的两种打包方式

    # 以下的两个命令生成不同的格式 ,
    python setup.py bdist_egg # 生成类似 mypack-0.0.1-py3.6.egg,支持 easy_install安装
    python setup.py sdist     # 生成类似 mypack-0.0.1.tar.gz,支持 pip 安装
    

    在这里插入图片描述

    以上截图分别是通过以上两个命令生成的的安装包 ,如果是本地用的话,就可以直接通过pip 或者easy_install安装 。但如果你想开源,你需要上传到PyPi

  2. 上传PyPi

    1. 在****https://pypi.python.org/pypi**** 上注册一个账号

    2. 在本地的用户目录下新建文件:.pypirc ,比如我的路径为:C:\Users\zhjy.pypirc 文件内容为:

      [distutils]index-servers=pypi 
      [pypi]
      repository = https://upload.pypi.org/legacy/
      username = yourname
      password = youpassword
      
    3. 安装twine,pip install twine .

    4. 使用twine进行上传 ,twine upload dist/* .

    这样你的包就可以被全世界下载了 。

3.包的下载与安装

包的下载和安装主要用到pip ,这里就主要介绍下pip的使用 ,pip虽然使用它非常简单,但是它的参数非常多,很多情况下我们都会使用到 。

以安装pymysql为例

命令说明举例
pip --version查看pip版本
pip install packagename安装包pip install pymysql
pip install packagename=0.9.3安装指定版本pip install pymysql=0.9.3
pip install packagename>=0.8.1安装最低版本pip install pymysql>=0.8.1
pip install --upgrade packagename升级指定包pip install --upgrade pymysql
pip uninstall packagename卸载指定包pip uninstall pymysql
pip search packagename搜索指定包pip search pymysql
pip show packagename查看安装包的信息pip show pymysql
pip list列出以安装的包
pip list -o列出可升级的包
pip freeze列出以安装的包,包名==版本显示
pip freeze > 文件导出到文件pip freeze > a.txt
pip install -r requirements.txt从文件中安装包
pip install packagename -i 镜像URL指定镜像下载pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip --default-timeout=600 install packagename设置超时时间pip install pymysql --default-timeout=600

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账 代码如下 使用须知: 1、工具--引用里勾选[Adobe Acrobat 10.0 Type Library] 2、安装Adobe Acrobat pro软件Dim sht As Worksheet Function BrowseFolders() As String 浏览目录Dim objshell As ObjectDim…

测试模型分类

测试模型 1. 概述 软件测试和软件开发一样,都遵循软件工程原理,遵循管理学原理,所以理解好软件的开发模型会便于理解测试模型. 软件测试的一般流程: 我们发现一般的软件测试流程和软件开发的流程一样,但是这样的流程测试介入的较晚,对于前期重大的bug很难修复.所以测试的流程…

网工内推 | 急招网工、运维,弹性工作,不加班,最高22K

01 Finogeeks 招聘岗位:运维工程师 职责描述: 1、负责FinClip小程序数字化管理系统产品的POC测试、交付部署、日常巡检工作,包括:交付运维方案、安装部署、数据对接调试、安全事件分析、日常巡检维护等 2、负责FinClip小程序数字…

QCustomPlot开源库使用

1.简介 QCustomPlot是用于绘图和数据可视化的Qt C 小部件。它没有进一步的依赖关系,并且有据可查。该绘图库专注于制作美观,出版质量的2D绘图,图形和图表,以及为实时可视化应用程序提供高性能。看一下“ 设置”和“ 基本绘图”教…

css的flex-direction: column;与direction: rtl;的作用

flex 个人理解 对子元素影响 设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。 作用自身的样式 1. flex-direction 属性决定主轴的方向(即项目的排列方向) 2. flex-wrap属性定义,如果一条轴线排不下, 如何换行。 3. flex-flow属性…

猫头虎分享:已解决RuoYi-Vue3 项目代码生成器默认生成代码使用的Vue2模板代码问题与Vue2升级到Vue3解决方案

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

PHP中一些特征函数导致的漏洞总结

第一部分: 特征函数 接触到几个常用的函数: \\ \\\ md5 intval strpos in_array preg_match str_replacephp用这些函数实现过滤一些代码,漏洞可能有一些特性,利用这些特征代码进行对比;账号密码对比;强制检…

由于找不到msvcr120.dll,无法继续执行代码

一、msvcr120.dll作用介绍 msvcr120.dll文件是Microsoft Visual C Redistributable Package的一部分,它是一个动态链接库(DLL)文件。这个文件在Windows操作系统中提供C运行时库支持,包含了大量系统级函数和对象,这些函…

jetson-inference----docker内运行分类任务

系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…

数据结构——静态链表

1.定义: (1)单链表:各个结点散落在内存中的各个角落,每个结点有指向下一个节点的指针(下一个结点在内存 中的地址); (2)静态链表:用数组的方式来描述线性表的链式存储结构: 分配一…

【业务功能篇133】 Mysql连接串优化性能问题

rewriteBatchedStatementstrue开启了MySQL驱动程序的批量处理功能。 spring.datasource.urljdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatementstrue 在MyBatis Plus框架中,批量插入是一种高效的数据库操作方式。通过开启rewriteBatchedStatementstr…

Vue3 Teleport 将组件传送到外层DOM位置

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

力扣刷MySQL-第八弹(详细讲解)

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出…

DAY18--learning English

一、积累 1.tobacco The disturbing History of Tobacco. 令人不安的烟草历史。 2.commodity How commodity Market work. 必需品商店是如何运作的. 3.cane Sugarcane --- 甘蔗 Sugarcane Farm --甘蔗农场 4.decay Tooth decay. 蛀牙 5.compensate Chinese gammer have evlove…

【Web前端实操13】实现100*100的盒子的阴影效果,阴影值自拟

相关知识点: 盒阴影 box-shadow 向框添加一个或多个阴影。 1 box-shadow: h-shadow v-shadow blur spread color inset; 值描述h-shadow必选,水平阴影的位置v-shadow必选,垂直阴影的位置blur可选,模糊距离spread可选&#xf…

Scrapy爬虫在新闻数据提取中的应用

Scrapy是一个强大的爬虫框架,广泛用于从网站上提取结构化数据。下面这段代码是Scrapy爬虫的一个例子,用于从新闻网站上提取和分组新闻数据。 使用场景 在新闻分析和内容聚合的场景中,收集和组织新闻数据是常见需求。例如,如果我…

史上最全知识图谱建模实践(上):本体结构与语义解耦

在“无需复杂图谱术语,7个原则搞定Schema建模”一文中,我们总结了知识建模最佳实践的7个指导原则。本文中,我们将分基础篇、进阶篇,针对不同业务场景的建模需求,由浅及深讲解基于SPG的知识建模的方法和案例&#xff0c…

JS进阶-深入面向对象(三)

看文章可以得到的收获: 1.在日常开发中,我们在声明一个数组对象后,没有声明有map,filter等方法,为什么可以调用这些方法呢? 2. 什么是面向过程思想,什么是面向对象思想呢? 3.JS中…

免费的 UI 设计资源网站 Top 8

今日与大家分享8个优秀的免费 UI 设计资源网站。这些网站的资源包括免费设计材料站、设计工具、字体和其他网站,尤其是一些材料站。它们是免费下载的,材料的风格目前很流行,适合不同的项目。非常适合平面设计WEB/UI设计师收藏,接下…

C#,数据检索算法之线性检索(Linear Search)的源代码

数据检索算法是指从数据集合(数组、表、哈希表等)中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 线性?听起来就“高大上”,其实,只不过就是挨个比较呗。 本文发布(听起来很正式 &#x…