当前位置: 首页 > news >正文

Python模块与包:扩展功能、提高效率的利器

在这里插入图片描述

文章目录

    • 一、引言
      • 1.1 模块与包对于Python开发的重要性
      • 1.2 Python作为拥有丰富生态系统的编程语言
    • 二、为什么学习模块与包
      • 2.1 复用代码:利用现有模块与包加速开发过程
      • 2.2 扩展功能:通过模块与包提供的功能增强应用的能力
    • 三、模块的使用
      • 3.1 导入模块:import语句的使用和不同的导入方式
      • 3.2 常用模块:常见的内置模块和第三方模块的介绍和应用场景
      • 3.3 自定义模块:如何创建自己的模块并使用
    • 四、包的使用
      • 4.1 包的概念和组织结构:模块的集合形成的目录结构
      • 4.2 导入包和模块:import语句的使用和包的层级结构
      • 4.3 包的初始化:__init__.py文件的作用和初始化过程
    • 五、常用模块和包的介绍
      • 5.1 文字处理:re、string等模块的介绍和使用
      • 5.2 数据处理:numpy、pandas等模块的介绍和使用
      • 5.3 网络通信:socket、requests等模块的介绍和使用
      • 5.4 图形图像:matplotlib、PIL等模块的介绍和使用
    • 六、模块和包的扩展
      • 6.1 添加搜索路径:sys模块的使用和自定义模块的搜索路径
      • 6.2 创建可执行脚本:__main__.py文件的作用和命令行参数的处理
      • 6.3 发布和安装模块与包:打包、发布和安装自己的模块与包
    • 七、实践项目:编写一个自定义的爬虫模块

重温Python,适合新手搭建知识体系,也适合大佬的温故知新~

一、引言

1.1 模块与包对于Python开发的重要性

模块和包是Python语言中非常重要的概念,它们可以让开发者组织代码并且使代码更加可维护和可重用。

模块

  • 模块是指一个Python文件,它包含了一些函数、类或变量等。
  • 在Python中,可以使用import关键字来导入一个模块,然后就可以使用该模块中的内容。这种方式可以避免命名冲突,并且提高了代码的可维护性和可读性。

  • 包是指一组相关的模块的集合,它们通常被组织在一个文件夹中,并且包含一个特殊的__init__.py文件。
  • 包可以帮助开发者将代码按照功能或者业务逻辑进行划分,并且可以方便地进行版本管理和发布。

实际使用场景

  • 使用第三方包来加速开发过程、提高代码质量和可维护性;
  • 将自己的代码打包成包进行发布和分享;
  • 使用模块和包的方式来组织测试代码、文档和示例代码等。

1.2 Python作为拥有丰富生态系统的编程语言

Python作为拥有丰富生态系统的编程语言,可以满足各种开发需求,并且具备良好的可扩展性和可维护性,在开发领域有着广泛的应用和强大的支持。

  1. Python拥有众多优秀的第三方库和框架。例如NumPy、Pandas、Scikit-learn等,它们提供了丰富的功能和算法,使得数据科学、机器学习、人工智能等领域的开发变得更加便捷和高效。
  2. Python在Web开发方面也有很强的生态系统。框架如DjangoFlask提供了强大的Web开发功能,使得构建Web应用变得简单而快速。此外,还有许多其他的库和工具可以帮助开发者实现前端开发、API开发、数据库管理等各个方面的需求。
  3. Python还被广泛用于科学计算、数据分析、自然语言处理等领域。在这些领域中,Python拥有诸如SciPy、NLTK、Spacy等专门的库和工具,可以方便地进行科学计算、文本处理等操作。
  4. Python社区非常活跃,拥有庞大的开发者群体和丰富的资源。开发者可以通过各种渠道获取帮助、分享经验和学习资源,这使得Python成为一门容易上手和学习的语言。

二、为什么学习模块与包

2.1 复用代码:利用现有模块与包加速开发过程

在Python中,复用代码可以通过使用现有的模块和包来加速开发过程。通过利用现有模块和包来复用代码,可以节省开发时间和精力,同时保证代码质量和可维护性。

  1. 导入标准库:Python内置了许多功能强大的标准库,例如osdatetime等,它们提供了各种常用的功能和工具函数,可以直接导入并在项目中使用。
import os
current_directory = os.getcwd()
  1. 使用第三方库:Python拥有众多优秀的第三方库,可以提供丰富的功能和工具。使用这些库可以避免从零开始编写代码,只需将其安装并导入即可。

    进行数据分析,可以使用Pandas库

import pandas as pd
data = pd.read_csv('data.csv')
  1. 构建自己的模块和包:根据项目的需求,可以将常用的功能封装为模块或包,以便在不同的项目中重复使用。可以将相关的函数、类和变量放在一个Python文件中,然后使用import语句导入。如果功能更为复杂,可以将多个模块组织成一个包,并在__init__.py文件中定义包的接口。

  2. 使用虚拟环境:在开发过程中,可以使用虚拟环境将项目的依赖与系统的Python环境隔离开,以防止不同项目之间的冲突。虚拟环境可以使用venv或者第三方工具如conda来创建和管理。

  3. 贡献代码给开源社区:如果你在开发过程中编写了一些通用的代码,可以考虑将其贡献给开源社区,成为一个开源项目。这样既可以帮助他人,也可以使自己的代码更加广泛地被使用和改进。

2.2 扩展功能:通过模块与包提供的功能增强应用的能力

在Python中,扩展应用的功能可以通过使用模块和包提供的工具和功能来实现。通过使用模块和包提供的工具和功能,可以为Python应用增加更多的功能和能力,让应用变得更加强大和灵活。

  1. 导入第三方库:Python拥有众多优秀的第三方库,可以提供各种功能和工具,例如数据分析、机器学习、图像处理等。通过导入这些库,可以为应用增加更多的功能。

    进行图像处理,可以使用OpenCV库

import cv2
img = cv2.imread('image.jpg')
  1. 自定义模块或包:根据应用的需求,可以编写自己的模块或包,以提供特定的功能或工具。可以将相关的函数、类和变量放在一个Python文件中,然后使用import语句导入。如果功能更为复杂,可以将多个模块组织成一个包,并在__init__.py文件中定义包的接口。

  2. 使用装饰器:Python中的装饰器可以在不改变原有代码的情况下为函数或类增加额外的功能。装饰器可以用于日志记录、性能统计、缓存等方面。

    使用装饰器为函数添加日志记录功能

def log(func):def wrapper(*args, **kwargs):print('调用函数:{}'.format(func.__name__))return func(*args, **kwargs)return wrapper@log
def foo():print('Hello, World!')foo()
  1. 使用扩展包:有些第三方包可以为Python提供功能扩展,例如NumPyPandas可以为Python提供更强大的数学计算和数据分析能力。通过安装和导入这些扩展包,可以为应用增加更多的功能。

  2. 使用插件:有些模块和包支持插件机制,可以通过编写插件来扩展它们的功能。例如,Sublime Text编辑器支持插件机制,可以编写插件来增加新的功能或者修改原有功能。

三、模块的使用

3.1 导入模块:import语句的使用和不同的导入方式

在Python中,导入模块是一种常见的方式,通过使用import语句可以将模块中的功能引入到当前的代码中。根据实际需求,选择适合的导入方式可以使代码更加清晰、可读性更高,并且避免命名冲突。

  1. 基本导入方式:使用import语句可以导入整个模块,并使用模块名作为前缀来访问其中的功能。
import module_name
module_name.function_name()
  1. 导入特定功能:可以使用from关键字来从模块中导入特定的功能,并直接使用功能名进行访问。这种方式可以避免每次使用时都需要写上模块名。
from module_name import function_name
function_name()
  1. 给导入的功能指定别名:使用as关键字可以给导入的功能指定一个别名,以方便使用。
from module_name import function_name as fn
fn()
  1. 导入整个模块并给模块指定别名:可以使用as关键字给导入的整个模块指定一个别名。
import module_name as mn
mn.function_name()
  1. 导入模块中的所有功能:使用from module_name import *语句可以导入模块中的所有功能。但是这种方式不太推荐使用,因为容易造成命名冲突和代码可读性降低。
from module_name import *
function_name()

ps:模块的导入顺序很重要。Python首次导入模块时,会执行该模块中的代码,并将结果保存到缓存中,后续再次导入时会直接使用缓存中的结果,而不会再次执行模块中的代码。

3.2 常用模块:常见的内置模块和第三方模块的介绍和应用场景

Python中有很多常用的模块,包括内置模块和第三方模块。根据实际需求,选择适合的模块可以极大地提高编程效率,并且使代码更加简洁、易读。

内置模块:

  1. os模块:提供了访问操作系统功能的接口,可以用于文件和目录操作、进程管理等。

    使用os.path.join()函数来连接路径名

import os
path = os.path.join('dir1', 'dir2', 'file.txt')
  1. datetime模块:提供了日期和时间处理的功能,可以进行日期和时间的计算、格式化和解析。

    使用datetime.now()获取当前时间

from datetime import datetime
now = datetime.now()
  1. math模块:提供了数学运算相关的函数,包括三角函数、指数函数、对数函数等。

    使用math.sin()函数计算正弦值

import math
x = math.sin(0.5)
  1. random模块:提供了随机数相关的功能,包括生成随机数、洗牌、样本抽取等。

    使用random.randint()函数生成一个随机整数

import random
x = random.randint(1, 10)

第三方模块:

  1. numpy模块:提供了高效的数值计算功能,包括数组操作、线性代数、傅里叶变换等。例如,可以使用numpy.array()创建一个数组:
import numpy as np
arr = np.array([1, 2, 3])
  1. pandas模块:提供了数据分析和处理相关的功能,包括读取和写入数据、数据清洗、切片和索引、数据聚合和透视等。

    使用pandas.read_csv()函数读取CSV文件

import pandas as pd
data = pd.read_csv('data.csv')
  1. matplotlib模块:提供了绘图和数据可视化的功能,可以生成各种类型的图表,包括线图、散点图、柱状图等。

    使用matplotlib.pyplot.plot()函数绘制一条曲线

import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [4, 5, 6]
plt.plot(x, y)
plt.show()
  1. requests模块:提供了HTTP请求相关的功能,可以用于发送HTTP请求并获取响应数据。

    使用requests.get()函数发送一个GET请求

import requests
response = requests.get('https://www.baidu.com')

3.3 自定义模块:如何创建自己的模块并使用

在Python中,可以通过创建自定义模块来封装一些功能,并在其他程序中进行复用。自定义模块的好处是可以将一些常用的功能封装起来,提高代码的重用性和可维护性。

  1. 创建模块文件:在一个新的.py文件中编写自己的模块代码。

    创建一个名为my_module.py的文件,其中包含一个简单的函数greet()

def greet(name):print(f"Hello, {name}!")
  1. 使用自定义模块:在需要使用自定义模块的程序中,使用import语句将模块引入,并使用模块名加上函数名来调用其中的功能。

    在另一个.py文件中使用my_module模块的greet()函数:

import my_modulemy_module.greet("Alice")
  1. 给模块指定别名:可以使用as关键字给导入的模块指定一个别名,以方便使用。

    my_module模块指定别名为mm

import my_module as mmmm.greet("Bob")
  1. 导入特定功能:使用from关键字可以从模块中导入特定的功能,并直接使用功能名进行访问。

    只导入my_module模块中的greet()函数:

from my_module import greetgreet("Charlie")

ps:自定义模块的文件名和模块名应该保持一致,以方便导入和使用。

四、包的使用

4.1 包的概念和组织结构:模块的集合形成的目录结构

在Python中,包是一种组织和管理模块的方式,它将相关的模块组织在一个目录下,并通过__init__.py文件来表示这个目录是一个包。包可以有多层次的结构,形成一个包含多个子包和模块的目录树。

包的组织结构示例

my_package/            # 包的根目录__init__.py        # 包的初始化文件module1.py         # 模块1module2.py         # 模块2subpackage/        # 子包__init__.py    # 子包的初始化文件module3.py     # 子包的模块1module4.py     # 子包的模块2

创建包的步骤

  1. 创建一个目录,作为包的根目录。
  2. 在根目录下创建一个名为__init__.py的空文件,用于表示这个目录是一个包。
  3. 在根目录下编写模块文件(以.py为扩展名)。
  4. 可以在根目录下创建子目录,并在子目录中按照相同的方式创建子包或模块。

要使用包中的模块,可以使用import语句来导入。例如,如果要导入包中的module1.py模块,可以这样做:

import my_package.module1

或者使用from语句导入特定的模块:

from my_package import module1

在导入子包中的模块时,可以使用点操作符进行访问。

导入subpackage子包中的module3.py模块:

from my_package.subpackage import module3

通过包的组织结构,可以更好地管理和组织代码,使代码结构清晰且易于维护。

4.2 导入包和模块:import语句的使用和包的层级结构

在Python中,可以使用import语句导入包和模块。通过导入包和模块,可以在代码中访问其中定义的函数、类和变量,并使用它们提供的功能。导入包和模块能够使代码更加模块化、可组织和易于维护。

  1. 导入整个包或模块

    # 导入包
    import package_name# 导入模块
    import module_name
    
  2. 导入特定的功能(函数、类等)

    # 导入包特定的功能
    from package_name import function_name# 导入模块特定的功能
    from module_name import function_name
    
  3. 给导入的包或模块指定别名

    # 给导入的包指定别名
    import package_name as alias_name# 给导入的模块指定别名
    import module_name as alias_name
    
  4. 给导入的功能指定别名

    # 给导入包的功能指定别名
    from package_name import function_name as alias_name# 给导入模块的功能指定别名
    from module_name import function_name as alias_name
    

4.3 包的初始化:init.py文件的作用和初始化过程

在Python中,__init__.py文件是用于初始化包的特殊文件。它在包被导入或使用之前会被自动执行,可以进行包的初始化操作、控制导入行为、提供包级别的功能,并处理循环导入问题。

作用和功能

  1. 标识包__init__.py文件的存在表明该目录是一个包。如果一个目录没有__init__.py文件,Python将不会将其视为包。
  2. 执行初始化代码__init__.py文件可以包含任意Python代码,这些代码将在包被导入或使用时执行。通常,__init__.py文件用于执行一些初始化操作,例如设置包的全局变量、导入子模块或包、注册资源等。
  3. 控制包的导入行为__init__.py文件可以通过定义__all__变量来控制包的导入行为。__all__是一个可选的列表,包含了可以从包中直接导入的模块或变量的名称。如果__all__未定义,那么使用import *语句导入包时,默认只会导入__init__.py文件中定义的内容。
  4. 提供包级别的功能__init__.py文件可以在包级别提供一些功能,例如定义包级别的函数、类、常量等。这些功能可以在包内的其他模块中共享和使用。
  5. 处理循环导入问题: 在包中存在多个模块相互导入的情况下,__init__.py文件可以用于处理循环导入问题。通过在__init__.py文件中按需导入模块,可以解决模块之间互相引用导致的循环导入错误。

初始化包的过程

  1. 当导入包时,Python会自动执行包目录下的__init__.py文件。
  2. __init__.py文件中的代码将按顺序执行,可以包含任意Python代码。
  3. 执行完__init__.py文件中的代码后,包的初始化完成,可以开始使用包内的模块和功能。

五、常用模块和包的介绍

5.1 文字处理:re、string等模块的介绍和使用

在Python中,有一些常用的模块可以用于处理文字,其中包括re(正则表达式)和string模块。

  1. re模块: re模块提供了对正则表达式的支持,可以用于字符串的模式匹配、查找和替换等操作。它包含了一系列函数和方法,例如match()search()findall()sub()等。

    import re# 使用match()函数匹配字符串开头
    pattern = r"hello"
    string = "hello world"
    match = re.match(pattern, string)
    if match:print("匹配成功")
    else:print("匹配失败")# 使用search()函数查找字符串中的匹配项
    pattern = r"world"
    string = "hello world"
    match = re.search(pattern, string)
    if match:print("找到匹配项")
    else:print("未找到匹配项")# 使用findall()函数查找所有匹配项
    pattern = r"\d+"
    string = "I have 2 apples and 3 oranges"
    matches = re.findall(pattern, string)
    print(matches)# 使用sub()函数替换匹配项
    pattern = r"apple"
    string = "I have an apple"
    new_string = re.sub(pattern, "orange", string)
    print(new_string)
    
  2. string模块: string模块提供了处理字符串的常用函数和常量。它包含了一些字符串操作的工具函数,例如strip()split()join()等。

    import string# 使用strip()函数去除字符串两端的空白字符
    s = "  hello world  "
    stripped_s = s.strip()
    print(stripped_s)# 使用split()函数将字符串拆分成列表
    s = "apple,banana,orange"
    items = s.split(",")
    print(items)# 使用join()函数将列表中的字符串连接成一个新的字符串
    items = ["apple", "banana", "orange"]
    new_string = ",".join(items)
    print(new_string)# 使用常量ASCII_LETTERS获取所有ASCII字母
    letters = string.ascii_letters
    print(letters)
    

5.2 数据处理:numpy、pandas等模块的介绍和使用

在Python中,有一些常用的模块可以用于数据处理,其中包括numpypandas等模块,用来进行科学计算、数据处理和分析等操作。

  1. numpy模块: numpy模块是Python中用于科学计算和数值分析的基础库。它提供了高性能的多维数组对象和一系列针对数组的数学函数和操作。numpy的核心是ndarray类,它表示n维数组对象。

    import numpy as np# 创建一个nparray数组
    a = np.array([1, 2, 3])
    print(a)# 创建一个二维的nparray数组
    b = np.array([[1, 2, 3], [4, 5, 6]])
    print(b)# 对数组进行运算
    c = a + b
    print(c)# 使用numpy中的数学函数
    d = np.sin(c)
    print(d)
    
  2. pandas模块: pandas模块是Python中用于数据处理和分析的库,提供了高效、灵活且易于使用的数据结构和工具。其核心是DataFrameSeries对象,分别用于表示二维表格和一维标签数组。

    import pandas as pd# 创建一个DataFrame对象
    data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35]}
    df = pd.DataFrame(data)
    print(df)# 从文件中读取数据创建DataFrame对象
    df = pd.read_csv('data.csv')
    print(df)# 对DataFrame进行操作
    df['salary'] = [5000, 6000, 7000]
    df['income'] = df['age'] * df['salary']
    print(df)# 使用pandas中的函数进行分析和处理
    mean_age = df['age'].mean()
    max_income = df['income'].max()
    print(mean_age, max_income)
    

5.3 网络通信:socket、requests等模块的介绍和使用

在Python中,有一些常用的模块可以用于网络通信,其中包括socketrequests等模块,在Python中实现网络通信和发送HTTP请求等操作。

  1. socket模块: socket模块是Python中用于网络编程的基础模块。它提供了标准的套接字接口,支持TCP、UDP等协议。使用socket模块可以实现网络通信中的服务器和客户端程序。

    import socket# 创建一个TCP服务器
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('localhost', 8000))
    server_socket.listen(5)
    while True:client_socket, client_address = server_socket.accept()data = client_socket.recv(1024)print('Received:', data)client_socket.sendall(data)client_socket.close()# 创建一个TCP客户端
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('localhost', 8000))
    client_socket.sendall(b'Hello World')
    data = client_socket.recv(1024)
    print('Received:', data)
    client_socket.close()
    
  2. requests模块: requests模块是Python中用于发送HTTP请求的库。它提供了简洁的API,使得发送HTTP请求变得容易。使用requests模块可以获取网页内容、发送POST请求等。

    import requests# 发送一个GET请求
    response = requests.get('http://www.baidu.com')
    print(response.content)# 发送一个POST请求
    data = {'name': 'Alice', 'age': 25}
    response = requests.post('http://www.example.com/api', data=data)
    print(response.json())
    

5.4 图形图像:matplotlib、PIL等模块的介绍和使用

在Python中,有一些常用的模块可以用于图形和图像处理,其中包括matplotlibPIL(Python Imaging Library)等模块,在Python中进行图形绘制和图像处理等操作。

  1. matplotlib模块: matplotlib模块是Python中用于绘制图形和数据可视化的库。它提供了丰富的绘图功能,包括折线图、散点图、柱状图等。使用matplotlib模块可以轻松地创建各种类型的图形。

    import matplotlib.pyplot as plt# 绘制折线图
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    plt.plot(x, y)
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Line Plot')
    plt.show()# 绘制散点图
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    plt.scatter(x, y)
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Scatter Plot')
    plt.show()# 绘制柱状图
    x = ['A', 'B', 'C', 'D', 'E']
    y = [10, 20, 30, 40, 50]
    plt.bar(x, y)
    plt.xlabel('Category')
    plt.ylabel('Value')
    plt.title('Bar Plot')
    plt.show()
    
  2. PIL(Python Imaging Library)模块: PIL模块是Python中用于图像处理的库。它提供了丰富的图像操作和处理功能,包括图像的打开、保存、缩放、旋转、裁剪等。使用PIL模块可以对图像进行各种处理和操作。

    from PIL import Image# 打开图像
    image = Image.open('image.jpg')# 显示图像
    image.show()# 缩放图像
    resized_image = image.resize((200, 200))
    resized_image.show()# 旋转图像
    rotated_image = image.rotate(45)
    rotated_image.show()# 裁剪图像
    cropped_image = image.crop((100, 100, 300, 300))
    cropped_image.show()# 保存图像
    resized_image.save('resized_image.jpg')
    

六、模块和包的扩展

6.1 添加搜索路径:sys模块的使用和自定义模块的搜索路径

在Python中,可以使用sys模块来添加搜索路径。sys模块是Python的内置模块之一,提供了与Python解释器和运行环境相关的功能。

要添加搜索路径,可以使用sys.path属性。sys.path是一个包含字符串路径的列表,表示Python解释器在导入模块时搜索的路径顺序。默认情况下,sys.path已经包含了一些默认路径,如当前工作目录和Python标准库的路径。

添加搜索路径:

import sys# 添加单个路径到搜索路径
sys.path.append('/path/to/module')# 添加多个路径到搜索路径
new_paths = ['/path/to/module1', '/path/to/module2']
sys.path.extend(new_paths)

临时添加路径:

import sys# 添加的路径会在其他路径之前被搜索
# 在开头添加单个路径到搜索路径
sys.path.insert(0, '/path/to/module')# 在开头添加多个路径到搜索路径
new_paths = ['/path/to/module1', '/path/to/module2']
sys.path[0:0] = new_paths

路径有几种常见方式

  1. 将模块放在已有的搜索路径下:将自定义模块放在Python已有的搜索路径中,如当前工作目录或Python标准库目录。
  2. 添加模块所在目录到sys.path:可以使用上述的sys.path.append()或sys.path.extend()函数将模块所在目录添加到搜索路径中。
  3. 使用PYTHONPATH环境变量:可以设置PYTHONPATH环境变量,将模块所在目录添加到其中。Python解释器会在导入模块时自动搜索PYTHONPATH中指定的路径。

ps:对于大型项目或需要频繁使用的自定义模块,建议将其安装为包,并使用pip进行安装管理,这样可以更方便地引用和维护模块。

6.2 创建可执行脚本:main.py文件的作用和命令行参数的处理

在Python中,可以创建可执行脚本,使其可以直接在命令行中运行。这可以通过创建一个名为__main__.py的文件来实现。

__main__.py文件是一个特殊的文件名,用于指定一个Python模块作为可执行脚本。当使用python -m 命令行运行时,Python解释器会将指定的模块作为主程序执行。

__main__.py文件:

def main():# 主程序逻辑print("Hello, World!")# 在if __name__ == "__main__":条件下,调用main()函数,这样当`__main__.py文件直接运行时,主程序会被执行
if __name__ == "__main__":main()

除了__main__.py文件的作用,Python还提供了处理命令行参数的方法。可以使用sys.argv获取传递给脚本的命令行参数列表。

如何处理命令行参数

import sysdef main():# 获取命令行参数args = sys.argv[1:]  # 排除脚本名称,用于获取除脚本名称外的所有命令行参数# 处理命令行参数for arg in args:print(arg)if __name__ == "__main__":main()# 从命令行运行python __main__.py arg1 arg2
# 输出结果
arg1
arg2

通过处理命令行参数,可以根据不同的参数执行不同的逻辑,实现更灵活的脚本功能。

6.3 发布和安装模块与包:打包、发布和安装自己的模块与包

在Python中,可以将自己编写的代码打包成模块或包进行发布和安装,以供其他人使用。

打包模块或包

使用setuptools库来打包模块或包。setuptools是一个用于构建和分发Python软件包的工具集,提供了一系列命令行工具和API,可以方便地打包、安装和发布Python软件包。

使用setuptools打包模块或包的基本步骤

  1. 创建一个包含模块或包代码的目录,并在其中添加setup.py文件。setup.py文件包含了打包、安装和发布模块或包的配置信息,如名称、版本、描述、作者等。
  2. setup.py文件中,使用setuptools.setup()函数来定义模块或包的元数据和依赖关系。
from setuptools import setup, find_packages# setup()函数定义了模块或包的名称、版本、描述、作者等信息,以及依赖于numpy和pandas库
setup(name='mypackage',version='1.0.0',description='A sample package',author='John Doe',packages=find_packages(),install_requires=['numpy','pandas']
)
  1. 使用python setup.py sdist命令生成源码包。源码包是一个包含模块或包源代码的压缩文件,通常以.tar.gz.zip为扩展名。在执行该命令后,会在当前目录下生成一个dist目录,其中包含了生成的源码包。
  2. 如果希望生成二进制包(如.whl文件),可以使用python setup.py bdist_wheel命令。生成的二进制包通常比源码包更容易安装和使用。

发布模块或包:

在打包完成后,可以将模块或包发布到Python Package Index(PyPI)上。PyPI是Python社区共享软件包的中心仓库,可以方便地搜索、下载和安装各种Python软件包。

发布模块或包的基本步骤

  1. PyPI上注册账号,并验证邮箱地址。
  2. 使用twine库上传源码包或二进制包到PyPI。可以使用以下命令安装twine库:
pip install twine
  1. 使用以下命令上传包:
# 将当前目录下dist目录中的所有包上传到PyPI上
twine upload dist/*

安装模块或包:

在发布模块或包后,其他用户就可以使用pip命令从PyPI上安装模块或包:

# 自动下载并安装名为mypackage的模块或包
pip install mypackage

如果需要安装特定版本的模块或包,可以使用以下命令:

# 安装版本号为1.0.0的mypackage模块或包
pip install mypackage==1.0.0

七、实践项目:编写一个自定义的爬虫模块

import requests
from bs4 import BeautifulSoup# 管理爬虫功能
class Spider:# 传入一个 URL 参数,并调用get_html()方法来获取解析后的HTML对象def __init__(self, url):self.url = urlself.soup = self.get_html()def get_html(self):# 发送 GET 请求response = requests.get(self.url)# 检查响应是否成功if response.status_code != 200:raise ValueError("Failed to retrieve page")# 解析 HTMLsoup = BeautifulSoup(response.text, "html.parser")return soup# 提取链接def get_links(self):# 提取所有链接links = self.soup.find_all("a")# 提取链接地址urls = []for link in links:href = link.get("href")if href:urls.append(href)return urls# 查找包含特定文本的标签,并返回结果列表def search_text(self, text):# 查找文本results = self.soup.find_all(text=text)return results

创建一个爬虫对象并执行相应的方法

spider = Spider("https://www.baidu.com")# 获取所有链接
links = spider.get_links()
print(links)# 查找包含 "百度" 文本的标签
results = spider.search_text("百度")
print(results)

人生虽曲折,记得活出精彩

相关文章:

Python模块与包:扩展功能、提高效率的利器

文章目录 一、引言1.1 模块与包对于Python开发的重要性1.2 Python作为拥有丰富生态系统的编程语言 二、为什么学习模块与包2.1 复用代码:利用现有模块与包加速开发过程2.2 扩展功能:通过模块与包提供的功能增强应用的能力 三、模块的使用3.1 导入模块&am…...

【每日一题】4.LeetCode——杨辉三角

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…...

蓝桥杯(Python)每日练Day5

题目 OJ1229 题目分析 题目完全符合栈的特征,后进先出。如果能够熟练使用列表的9种方法那么这道题很容易解出。 题解 a[]#存衣服 nint(input()) for i in range(n):llist(input().split())#判断每一步的操作if len(l[0])2:a.append(l[1])else:while a.pop()!l…...

SpringCloud(二)

Spring Cloud 文章目录 Spring Cloud任务三:Spring Cloud与微服务架构1.Spring Cloud课程内容介绍2.单体应用架构2.1 互联网应用架构演进2.2 单体应用架构 3.垂直应用架构4.SOA应用架构5.微服务应用架构介绍6.微服务架构核心思想及优缺点7.微服务架构的核心概念8.Sp…...

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别? 2、 final、finally、finalize 有什么区别? 3、try-catch-finally 中哪个部分可以省略? 4、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗&#…...

虚幻UE 插件-像素流送实现和优化

本笔记记录了像素流送插件的实现和优化过程。 UE version:5.3 文章目录 一、像素流送二、实现步骤1、开启像素流送插件2、设置参数3、打包程序4、打包后的程序进行像素流参数设置5、下载NodeJS6、下载信令服务器7、对信令服务器进行设置8、启动像素流送 三、优化1、…...

Vue2 props组件通信

一、父组件向子组件传值 1、流程图 2、父组件代码 <template><div class"app"><UserInfo:usernameusername:ageage:isSingleisSingle:carcar:hobbyhobby></UserInfo></div> </template><script> import UserInfo from .…...

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…...

群狼调研(长沙品牌忠诚度测试)|广告效果测评方法

广告效果测评方法可以根据具体的目标和需求而有所差异&#xff0c;以下是一些常见的广告效果测评方法&#xff1a; 1.品牌调研和调查&#xff1a;通过定量或定性的调研和调查方法&#xff0c;评估广告对品牌认知、品牌形象和品牌偏好的影响&#xff0c;包括品牌知名度、品牌关联…...

Gradle学习笔记:Gradle的使用方法

文章目录 1.初始化项目2.构建脚本语言选择3.项目命名4.项目构建过程 1.初始化项目 创建一个test空文件夹&#xff0c;在该文件夹下打开终端&#xff0c;并执行命令&#xff1a;gradle init. 会有一个选项让你选择项目的类型。下面是每个选项的含义和用途&#xff1a; basic&am…...

少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(选择题)

2023年12月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、在制作推箱子游戏时,地图是用数字形式储存在电脑里的,下图是一个推箱子地图,地图表示如下:第一行( 111111)第二行( 132231) 第三行( 126621) 第四行( ) 第五行( 152321) 第六行( 111111 ) 根…...

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …...

Sybase PowerDesigner15安装配置

1&#xff0c;软件介绍 ​ Power Designer 是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型&#xff0c;还可以为数据仓…...

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高&#xff0c;农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一&#xff0c;其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制&#xff0c;不仅效率低下&#xff0c;而…...

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…...

java多线程测试websocket demo(使用文件流)

这个demo主要是利用Java多线程来测试WebSocket通信。首先&#xff0c;创建一个WebSocket服务器和客户端&#xff0c;然后使用多线程来模拟多个客户端同时连接服务器进行通信。通过多线程测试&#xff0c;可以验证WebSocket通信的并发性能和稳定性。同时&#xff0c;可以通过多线…...

Tosei 自助网络店铺管理系统network_test.php_RCE漏洞复现

简介 Tosei 自助洗衣机是日本一家公司的产品,在 network_test.php 文件存在命令执行 漏洞复现 FOFA语法: body="tosei_login_check.php" 主要是日本 访问界面如下所示: 验证POC: /cgi-bin/network_test.php 拼接访问url: https://ip:port/cgi-bin/network_tes…...

uni-app 国际化

vue i18n v9的迁移后的$t()无法获取数组、对象 http://t.csdnimg.cn/WkCHy api:vue i18n [intlify] Not found ‘language’ key in ‘zh-Hans’ locale messages. [intlify] Fall back to translate ‘language’ key with ‘zh’ locale. [intlify] Not found ‘languag…...

git:git reset 和 git revert

在使用 git 进行项目开发的过程中&#xff0c;有时会出现错误提交的情况&#xff0c;这时就需要能够撤销错误的提交&#xff0c;将代码恢复到提交之前的样子。根据不同情况&#xff0c;可以使用 git reset 或 git revert 命令。 一. git reset git reset 的原理是修改 HEAD 的…...

LeetCode:670. 最大交换(Java 贪心)

目录 670. 最大交换 题目描述&#xff1a; 实现代码与解析&#xff1b; 贪心 原理思路&#xff1a; 670. 最大交换 题目描述&#xff1a; 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释…...

【STM32】STM32学习笔记-Unix时间戳(41)

00. 目录 文章目录 00. 目录01. Unix时间戳02. UTC/GMT03. 时间戳转换04. C 标准库 <time.h>05. 时间相关函数示例5.1 time函数5.2 gmtime函数5.3 localtime函数5.4 mktime函数5.5 ctime函数5.6 asctime函数5.7 strftime函数 06. 预留07. 附录 01. Unix时间戳 •Unix 时…...

2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 低分辨率下看世界 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#xff0c…...

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码&#xff08;配置文件&#xff09;application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性&#xff0c;这些属性将由…...

【蓝桥杯选拔赛真题61】python偶数平方 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

目录 python偶数平方 一、题目要求 1、编程实现 2、输入输出...

智能语音识别源码系统+语义理解+对话管理+语音合成 带完整的搭建教程

人工智能技术的不断发展&#xff0c;智能语音识别技术逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;目前市场上的智能语音识别产品大多存在一定的局限性&#xff0c;如识别率不高、功能单一等。为了解决这些问题&#xff0c;罗峰给大家分享一款基于智能语音…...

cdh6.3.2的hive配udf

背景 大数据平台的租户要使用udf&#xff0c;他们用beeline连接&#xff0c; 意味着要通过hs2&#xff0c;但如果有多个hs2&#xff0c;各个hs2之间不能共享&#xff0c;需要先把文件传到hdfs&#xff0c;然后手动在各hs2上create function。之后就可以永久使用了&#xff0c;…...

在DevEco开发工具中,使用Previewer预览界面中的UI组件

1、在DevEco工具中&#xff0c;点击并展开PreViewer预览器 2、在PreViewer预览器中&#xff0c;点击Tt按钮&#xff08;Inspector&#xff09;切换至组件查看模式 3、在组件查看模式下选择组件&#xff0c;代码呈现选中状态&#xff0c;右侧呈现组件树&#xff0c;右下方呈现组…...

【蓝桥杯冲冲冲】旅行计划

蓝桥杯备赛 | 洛谷做题打卡day18 文章目录 蓝桥杯备赛 | 洛谷做题打卡day18旅行计划题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 旅行计划 题目描述 Kira酱要去一个国家旅游。这个国家有 N N N 个城市&#xff0c;编号为 1 1 1 至 N N…...

Ultraleap 3Di配置以及在 Unity 中使用 Ultraleap 3Di手部跟踪

0 开发需求 1、硬件&#xff1a;Ultraleap 手部追踪相机&#xff08;Ultraleap 3Di&#xff09; 2、软件&#xff1a;在计算机上安装Ultraleap Gemini (V5.2) 手部跟踪软件。 3、版本&#xff1a;Unity 2021 LTS 或更高版本 4、Unity XR插件管理&#xff1a;可从软件包管理器窗…...

HarmonyOS鸿蒙学习基础篇 - Text文本组件

该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Text文本组件是可以显示一段文本的组件。该组件从API Version 7开始支持&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 子组件 可…...

wordpress成功的网站/企业培训课程安排表

void main(void){ Delay_ms(1000);//让设备稳定 InitUart(); //串口初始化while(1){ DHT11(); //获取温湿度 P0DIR | 0x40; //IO口需要重新配置 /******温湿度的ASC码转换*******/ temp[0]wendu_shi0x30; temp[1]wendu_ge0x30; humidity[0]shidu_shi0x30; humidity[1]shidu_ge0…...

谷歌网站开发语言/百度网盘网页版

在学习Python时&#xff0c;很多人会问到__builtin__、__builtins__和builtins之间有什么关系。百度或Google一下&#xff0c;有很 多答案&#xff0c;但是这些答案要么不准确&#xff0c;要么只说了一点点&#xff0c;并不全面。本文将给大家一个较为全面的答案。以下结果是经…...

做外汇网站/独立站seo是什么意思

使用pip进行安装&#xff0c;报错pip._vendor.urllib3.exceptions.ReadTimeoutError 这是因为下载速度过慢而导致的错误&#xff0c;我们可以设置他的时间。 pip install --default-timeout100 后面再加我们需要安装的东西即可&#xff0c;例如安装requirements.txt内的内容…...

xampp wordpress 安装/河北优化seo

文章目录01. ElasticSearch 搜索结果的准确性和召回率是什么&#xff1f;02. ElasticSearch 字段支持的数据类型有哪些&#xff1f;03. ElasticSearch 映射是什么&#xff1f;04. ElasticSearch 动态映射是什么&#xff1f;05. ElasticSearch 字段的属性有哪些&#xff1f;06. …...

济南网站建设开发公司哪家好/seo建站网络公司

简单工厂、工厂方法、抽象工厂 简单工厂 通过定义多个factory.produceXXX()方法&#xff0c;或者通过向factory.produce(type)传递type参数来生成产品。添加新产品需要添加produeXXX()方法或个性produce(type)来支持生成新的产品。 工厂方法 一个Factory接口&#xff0c;接口中…...

网络规划与设计专业/网站信息组织优化

点击上方“JAVA”&#xff0c;星标公众号重磅干货&#xff0c;第一时间送达目录&#xff1a;1.jdk1.7中的HashMap1.1 扩容造成死循环分析过程1.2 扩容造成数据丢失分析过程2.jdk1.8中HashMap总结前言&#xff1a;我们都知道HashMap是线程不安全的&#xff0c;在多线程环境中不建…...