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_module

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

    my_module模块指定别名为mm

import my_module as mm

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

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

from my_module import greet

greet("Charlie")

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

四、包的使用

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

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

包的组织结构示例

my_package/            # 包的根目录
    __init__.py        # 包的初始化文件
    module1.py         # 模块1
    module2.py         # 模块2
    subpackage/        # 子包
        __init__.py    # 子包的初始化文件
        module3.py     # 子包的模块1
        module4.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 sys

def 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 = url
        self.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")

        # 解析 HTML
        soup = 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站域名一定要部署SSL证书吗?

随着互联网的发展,网络安全问题越来越受到重视。为网站域名部署SSL证书更是成为站长们维护网站安全的基础措施之一,但是这并非是强制性的,因此有不少人对部署SSL证书的必要性产生疑惑,网站域名一定要部署SSL证书吗?在本…

part1. jdk8新特性详解

1.Lambda //1.匿名内部类new Thread(new Runnable() {Overridepublic void run() {System.out.println("新线程中执行的代码:"Thread.currentThread().getName());}}).start();System.out.println("主线程中的代码:"Thread.currentThread().ge…

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

Maven(上):Maven介绍、安装配置及工程构建

1. Maven介绍 Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 Maven就是一个软件,掌握安装、配置、以及基本功能 &#xff…

19 python快速上手

面向对象高级和应用 1. 继承【补充】1.1 mro和c3算法1.2 py2和py3区别(了解) 2. 内置函数补充3.异常处理3.1 异常细分3.2 自定义异常&抛出异常3.4 特殊的finally 4.反射4.1 一些皆对象4.2 import_module 反射 总结 各位小伙伴想要博客相关资料的话关…

vue3---inputRef.value.focus()报错Cannot read properties of null (reading ‘focus‘)

问题描述&#xff1a;点击编辑按钮&#xff0c;出现el-input框&#xff08;el-input显示隐藏通过v-if控制&#xff09; <el-input ref"inputRef" v-if"isEdit" v-model"modelName" blur"isEdit false" /> <el-button text …

python-自动化篇-办公-excel-实例应用(一维转二维)

文章目录 准备代码效果 准备 放根目录 代码 import openpyxl wbopenpyxl.load_workbook(业绩表.xlsx) if not 二维表 in wb.sheetnames:nwswb.create_sheet(二维表)wswb.worksheets[0]rngslist(ws.values)[1:]mmlist({m.value: for m in ws[b][1:]})namelist({m.value: for …

(2)(2.8) Holybro 900Mhz XBP9X无线电遥测设备

文章目录 前言 1 特点 2 规格 3 电源 4 引脚输出 5 下载 前言 Holybro XBP9X 无线电设备可使用 Digi 免费的 XCTU 软件或通过 Digi 简化的 AT 或 API 命令集轻松进行配置。无线电台采用 256 位 AES 加密技术&#xff0c;可在设备之间安全可靠地传输关键数据。无线电的射…

基于Kubernetes(K8s)构建企业容器云基础运行环境

cncfstack 新 文章上线&#xff1a; 书名&#xff1a;《云原生解决方案》 地址&#xff1a;https://zhaowenyu.com/cncf-solution 访问&#xff1a;文章底部“阅读原文”或访问域名 云原生计算是云计算发展新的里程碑阶段&#xff0c;是当今与未来很长一段时间中 IT 发展的技…

代码随想录 Leetcode111. 二叉树的最小深度

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; class Solution { public:int minDepth(TreeNode* root) {if(root nullptr) return 0;queue<TreeNode*> que;TreeNode* cur root;que.push(cur);int size 0;int depth 0;while (!que.empty()…

Tomcat session复制及session共享技术

目录 1、环境 2、配置测试页面 3、配置session共享 前言&#xff1a; 为什么要做session复制或共享 实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享&#xff0c;以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因&#x…

C语言基本概念

目录 2.1 编写一个简单的C程序 2.1.1 编译和链接 2.1.2 集成开发环境 2.2 简单程序的一般形式 2.2.1 指令 2.2.2 函数 2.2.3 语句 2.3 注释 2.4 变量和赋值 2.4.1 类型 2.4.2 声明 2.4.3 赋值 2.4.4 显示变量的值 2.4.5 初始化 2.4.6 显示表达式的值 2.5 读入…

7款值得去尝试的前端动画特效(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 橙汁粒子特效 一款基于canvas实现的粒子动画特效 点击杯子 杯子上方会有橙子掉落至杯中并变为橙…

如何做标准化?| 京东云技术团队

在现代信息化的市场环境和社会中&#xff0c;标准化已经成为了各种行业的一个重要的标志。标准化不仅可以提升生产效率&#xff0c;减轻质量问题&#xff0c;还可以增加产品的可靠性和互通性。在这篇文章中&#xff0c;我们将探讨如何做标准化&#xff0c;为您提供详细的指导和…

深入理解Java类和对象的关系

如果要说清楚对象和类的关系&#xff0c;不可避免的要提到C&#xff0c;因为Java从时间线上来说&#xff0c;是C和C之后的一门语言&#xff0c;很多Java Coder 也是因为厌烦了C的一些特性&#xff0c;进而从事于Java开发的&#xff0c;所以以下内容会利用C的一部分知识来对比&a…

Mac+Android Studio配置 Flutter环境

Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…

【C/C++】C/C++编程——第一个 C++ 程序:HelloWorld

第一个 C 程序&#xff1a;HelloWorld 大家好&#xff0c;我是 shopeeai&#xff0c;也可以叫我虾皮&#xff0c;中科大菜鸟研究生。昨天我们成功搭建好了 C 的开发环境&#xff0c;今天我们来介绍一下第一个 C 程序,打印一个"hello world"。首先我们先贴一下示例代…

Linux(linux版本 centos 7) 下安装 oracle 19c详细教程(新手小白易上手)

一、安装前准备 1、下载预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm预安装包下载成功 2、下载oracle安装包 下载地址如下 https://www.oracle.com/cn/database/technologies…

Python 正则分割字符串并提取匹配的记号和关键词

需求是&#xff1a;原字符串内含有特殊记号&#xff0c;比如"V_{CC} V_{DD}"&#xff0c;其中_{CC} 是latex 的下标语法&#xff0c;实际显示出来是下面这样&#xff1a; V C C V D D V_{CC} V_{DD} VCC​VDD​ 现在要把下标部分提取出来&#xff0c;并把原字符串…

Python之数据可视化基础

目录 一 JSON数据格式转换 二 pyecharts模块 三 Pyecharts入门 四 数据可视化之疫情折线图 一 JSON数据格式转换 什么是JSON? JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它以易于阅读和编写的方式来表示结构化数据。JSO…