Python项目编译与部署(1):模块与包的概念与关系

news2024/11/16 18:04:56

当实际构建1个 Python 项目时,模块与包是我们面临的基础概念。

1、模块、包的概念

Python中的模块(Module), 就是一个单独的.py文件,其中包含变量定义,函数定义、类定义、以及其它可执行语句。模块是一个独立的代码单元,可以用解释器直接运行,可以导入到其他模块中。

另一方面,包是一个目录中所包含的模块集合。包允许我们将多个相关模块组合在一个公共命名空间下,从而更容易组织和构建我们的代码库。

将代码分解为模块和包可以带来巨大的好处:

  • 可维护性。将代码分解为模块,有助于我们对整个应用程序的独立部分进行更改,而不会影响整个应用程序,因为模块的设计仅用于处理应用程序的一部分。
  • 可重复使用性。这是软件开发的关键部分,我们只需编写一次代码,就可以根据需要在应用程序的许多不同部分中多次使用它。这使我们能够编写干净、简洁的代码。
  • 方便分工合作。模块化代码,团队的不同开发者可以分别承担同一应用程序的不同部分(模块),而不会相互干扰。
  • 可读性。将代码分解为模块和包可以提高代码的可读性。可以很容易地分辨出文件中不同代码的功能。例如,我们可能有一个名为databaseConnection. py的文件:仅从名称上我们就可以知道这个文件处理数据库连接。

2、模块详解

模块包含可执行语句及函数定义。这些语句用于初始化模块,且仅在 import 语句 第一次 遇到模块名时执行。 (文件作为脚本运行时,也会执行这些语句。)

每个模块都有自己的私有命名空间,它会被用作模块中定义的所有函数的全局命名空间。 因此,模块作者可以在模块内使用全局变量而不必担心与用户的全局变量发生意外冲突。 另一方面,如果你知道要怎么做就可以通过与引用模块函数一样的标记法 modname.itemname 来访问一个模块的全局变量。

2.1 创建模块的示例

打开IDE或文本编辑器,创建一个文件,将其命名为sample. py并输入以下代码:

# sample.py

# create a variable in the module
sample_variable  = "This is a string variable in the sample.py module"

# A function in the module
def say_hello(name):
  return f"Hello, {name}  welcome to this simple module."

# This is another function in the module
def add(a, b):
  return f"{a} + {b} is = {a+b}"

print(sample_variable)
print(say_hello("小明"))
print(add(2, 3))

上面的代码定义了一个名为sample. py的模块。它包含一个名为sample_variable的变量,其值是字符串“This is a string variable in the sample.py module”。此模块还包含两个函数定义。调用时,say_hello ()函数接收一个名称参数,如果我们将一个名称传递给它,它会返回一个欢迎消息。add ()函数返回传递给它的两个数字的和。
虽然模块是用于程序或应用程序的其他部分的,但我们可以单独运行它们。要运行此模块,我们需要在开发环境中安装Python。我们可以使用以下命令在终端上运行它:

python sample.py 

或者

python3 sameple.py

运行结果

This is a string variable in the sample.py module
Hello, 小明  welcome to this simple module.
2 + 3 is = 5

我们可以将其作为独立模块运行,但大多数使用场景下,1个模块通常是导入其他模块或Python 主程序来使用的。因此,要在另一个模块中使用一个模块中的变量、函数和类,我们必须导入该模块。有不同的方法来导入模块,所以让我们来看看如何导入模块

2.2 import 语句

用import module_name 可将另1个模块内容导入到本模块中。如在 another_module.py中使用 import sample

# another_module.py

import sample

print(sample.sample_variable)
print(sample.say_hello(“John”))
print(sample.add(2, 3))

上面的代码展示了如何从sample.py模块导入函数,使它们可以在another_module.py中使用。注意,当导入模块时,不需要包括.py扩展名

2.3 使用 from … import … 语句

还可以使用from关键字来导入特定的函数或变量。假设一个模块中定义了大量的函数和变量,我们不想全部使用它们。可以使用from关键字指定要使用的函数或变量:


# another_module.py

from sample import add

print(add(10, 4))

上面的代码表明,我们已经从示例模块中专门导入了add()函数。
使用from关键字的另一个好处是,使用导入的函数时,无需对其进行命名或在其前面加上其父模块的名称。这将导致代码更加简洁易读。

2.4 使用 as 关键字

我们可以使用“as”为模块提供别名或备用名称。

有时,我们可能会定义相当长或不可读的模块名称。Python提供了一种为模块导入提供别名的方法,为此,我们将使用as关键字:

# another_module.py

import sample as sp

result = sp.add(5, 5)
print(result)
print(sp.say_hello("Jason"))

这段代码显示了样本模块的导入,其中模块被赋予别名sp。使用sp与调用sample 完全相同。同样可以访问变量和函数。

使用上述三种方法,我们可以在另一个模块中使用一个模块的变量或函数,从而增强了应用程序的可读性,因为我们不需要将代码放在一个文件中。

在命名模块名称时,最好使用小写字母,两个词之间使用_下列线分隔。例如,有一个用于处理数据库连接的模块,可以将其命名为database_connection.py。此外,请记住Python中的名称区分大小写,因此在导入时请确保使用正确的模块名称。

总的来说,使用模块,可以让我们以可读和可维护的方式创建和组织代码。

包的介绍

Python中的包是将相关模块组织到目录中的一种方式。它提供了一种更好的代码组织方式,通常对于完成同1功能,或属于同一组件的模块使用包来进行分组。
包是通过使用“.”点号来表示同1个包、模块、函数(全局变量)的层级关系。例如,模块名称A.B指定了名为A的包中名为B的子模块。

1) Package包, Module模块与文件的关系

Package(包), Module(模块), file(文件) 三者关系,

  • Package由模块组成,相当于Modules 的命名空间
  • Module, 包含功能代码的.py 代码文件也称为 module , 但不能把 config.py , __init__.py称为模块。
    在这里插入图片描述

2) 包与目录的关系

虽然在形式上,可以把1个包理解为1个目录,但并非是包含代码的目录都是包,
在这里插入图片描述

二者区分的关键是, 包目录包含 __init__.py 文件,不包含此文件的不能称之为包目录

Package可以包含 sub package, 但其目录下也必须有__init__.py

使用时,用点号来表示层次关系

mypkg.mymodule.func_1()

3) 导入包,模块, 函数

对于当前项目 project_demo 来说,要导入的包 mypkg 是依赖库。必须要告知 mypkg 的路径。

如 sys.path.append(“d:/workplace/project_demo/mypkg”),否则导入包时可能会遇到一些问题。

示例:

from mypkg import mymodule

import mypkg.mymodule

from mypkg.mymodule import *

from mypkg.mymodule import func_1

二级结构的包,如何导入子包。

当项目 sound 包下面还有多个子包: filters, effects, formats 等子包。

绝对引用:

模块 sound.filters.vocoder需要使用 sound.effects 子包下的echo module, 这样引用:

from sound.effects import echo

相对引用

from . import echo 表示导入当前包下面的echo模块

from … import formats 表示从父目录下导入 formats 子包。

模块搜索路径

导入名为exam的模块时,解释器首先搜索具有该名称的内置模块。这些模块名称列在sys.builtin_module_names中。如果找不到,它将在变量sys.path给定的目录列表中搜索名为spam.py的文件。sys.path从以下位置初始化:

  • 被命令行直接运行的.py脚本所在的目录(或未指定文件时的当前目录)。
  • PYTHONPATH (目录列表,与 shell 变量 PATH 的语法一样)。
  • 依赖于安装的默认值(按照惯例包括一个 site-packages 目录,由 site 模块处理)。
>>> import sys
>>> sys.path
['',
'C:\\opt\\Python36\\python36.zip',
'C:\\opt\\Python36\\DLLs',
'C:\\opt\\Python36\\lib',
'C:\\opt\\Python36',
'C:\\Users\\NanoDano\\AppData\\Roaming\\Python\\Python36\\site-packages',
'C:\\opt\\Python36\\lib\\site-packages',
'C:\\opt\\Python36\\lib\\site-packages\\win32',
'C:\\opt\\Python36\\lib\\site-packages\\win32\\lib',
'C:\\opt\\Python36\\lib\\site-packages\\Pythonwin']

更改sys.path的3种方式:

(1) appending a path

sys.path.append(``'C:/Users/Vanshi/Desktop'``)

(2) sys.path 初始化时会读python的系统变量 PYTHONPATH 。可以在启动脚本中修改PYTHONPATH, 语法与 环境变量path相同

set PYTHONPATH=C:\pypath1\;C:\pypath2\
python -c "import sys; print(sys.path)"
# Example output
['', 'C:\\pypath1', 'C:\\pypath2', 'C:\\opt\\Python36\\python36.zip', 'C:\\opt\\Python36\\DLL

set 变量名=值 是临时添加,关闭terminal 后则失效。

永久性添加可修改环境变量, 应小心使用
setx ENV_NAME env_value,

如:

setx -m PATH “%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin”

Linux中添加环境变量命令

export PYTHONPATH=‘/some/extra/path’

(3) 使用site模块来修改sys.path

在程序代码中修改sys.path 变量, 这样系统启动时加载它,就可以找到相应模块了。

import site
import sys

site.addsitedir('/the/path')  # Always appends to end
print(sys.path)

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

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

相关文章

安装Tensorboard

打开Pycharm打开Terminal 窗口,输入pip install tensorboard pip install tensorboard

【高阶产品策略】如何从0到1搭建策略产品

文章目录 1、策略概述2、如何从0到1搭建推荐策略产品3、策略产品实施案例4、策略产品经理结构化思考方法 1、策略概述 2、如何从0到1搭建推荐策略产品 3、策略产品实施案例 4、策略产品经理结构化思考方法

【算法竞赛宝典】排名次

【算法竞赛宝典】排名次 题目描述代码展示代码讲解 题目描述 代码展示 //求名次 #include <iostream>using namespace std; #define n 10000 int i, j, mingci; int a[n 1];int main() {int m 0;cin >> m;for (i 1; i < m; i)cin >> a[i];for (i 1; …

HTTP介绍:一文了解什么是HTTP

前言&#xff1a; 在当今数字时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。无论是浏览网页、发送电子邮件还是在线购物&#xff0c;我们都离不开超文本传输协议&#xff08;HTTP&#xff09;。HTTP作为一种通信协议&#xff0c;扮演着连接客户端和服务器的重要角…

【国漫】小舞生日人气大跌,难以再现辉煌,她还是国漫一姐吗?

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫&#xff01; 角色生日的规模&#xff0c;在一定程度可以展现角色的人气和粉丝基础&#xff0c;很多粉丝也会借着角色生日的机会&#xff0c;拼尽全力氪金和筹备&#xff0c;一方面是为了向路人观众展现喜欢角色的魅力…

【业务功能篇93】微服务-springcloud-springboot-认证服务-注册功能-第三方短信验证API

商城认证服务 一、搭建认证服务环境 结合我们前面介绍的商城的架构我们需要单独的搭建一个认证服务。 1.创建项目 首先创建一个SpringBoot项目&#xff0c;然后添加对应的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

勃艮第葡萄酒是如何分级的?

勃艮第葡萄酒来自一个同名的地区:勃艮第&#xff0c;它位于法国中东部&#xff0c;在西部的卢瓦尔河和东部的索恩河之间。该地区最大的城市是欧塞尔、第戎、马孔和内韦尔。由于地处国家中心&#xff0c;勃艮第属于大陆性气候&#xff0c;夏季炎热&#xff0c;冬季寒冷。这种气候…

Mac不想用iTerm2了怎么办

这东西真是让人又爱又恨&#xff0c;爱的是它的UI还真不错&#xff0c;恨的是它把我的环境给破坏啦&#xff01;让我每次启动终端之后都要重新source激活我的python环境&#xff0c;而且虚拟环境前面没有括号啦&#xff01;这怎么能忍&#xff01;在UI和实用性面前我断然选择实…

3D点云处理:提取指定圆环内的点(附源码)

文章目录 0. 测试效果1. 基本内容2. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:提取指定范围的点云0. 测试效果 红色为根据指定条件提取的点 1. 基本内容 要提取指定圆环内和指定高度范围内的点云,可以按照以下步骤进行操作: 定义圆环和高度参数…

区块链实验室(19) - 在新建的无标度网络中配置控制台

在前文区块链实验室(18) - 用FISCO BCOS架设1个无标度网络中架设了1个网络&#xff0c;这个网络还没有配置控制台。FISCO-BCOS技术文档给出了一个创建4节点的网络以及控制台&#xff0c;那个控制台不能直接用于该文的无标度网络&#xff0c;主要是因为控制台证书不匹配。 本文…

FPGA时序分析与约束(3)——时钟不确定性

一、前言 在之前的文章中&#xff0c;我们介绍了组合电路的时序和时序电路的时序问题&#xff0c;在阅读本文章之前&#xff0c;强烈推荐先阅读完本系列之前的文章&#xff0c;因为这是我们继续学习的理论的理论基础&#xff0c;前文链接&#xff1a; FPGA时序分析与约束&…

富士施乐S2110复印机先后提示代码045-313、092-910、092-668故障解决

故障描述 : 用户一台富士施乐S2110复印机使用过程中报错045-313,电话沟通分析可能是硒鼓出现了问题,本着负责的态度上门检查并确认故障;到用户处后先重新插拔一下硒鼓然后再重新开机进行测试,开机后能复印及打印几张然后后报错092-910 ,以为硒鼓没有安装好再次重插…

在CAD中批量测量线段的长度

我们经常会有批量测量线段长度的需求&#xff0c;但是线段太多了&#xff0c;一个个加属实浪费时间。网上对这方面也只是个别晦涩的解决方法&#xff0c;大部分无法实用&#xff0c;本文介绍了笔者认为一种最轻松的测量办法。 下图即我们需要测量的线段组&#xff0c;正常测肯定…

【JS】—闭包—双例对比法学习总结

一、选定知识点&#xff1a;闭包 二、指令学习 1. 闭包MDN的定义 闭包&#xff08;closure&#xff09;是一个函数以及其捆绑的周边环境状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用的组合。换而言之&#xff0c;闭包让开发者可以从内部函数…

Cordova Android 生成的 APK 中添加代码混淆

要在 Cordova Android 生成的 APK 中添加代码混淆&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 在项目根目录下&#xff0c;找到 platforms/android/ 目录&#xff0c;进入该目录。 2. 打开 build.gradle 文件&#xff0c;并在 android { ... } 部分添加以下代码&…

在Windows10上编译grpc工程,得到protoc.exe和grpc_cpp_plugin.exe

grpc是google于2015年发布的一款跨进程、跨语言、开源的RPC(远程过程调用)技术。使用C/S模式&#xff0c;在客户端、服务端共享一个protobuf二进制数据。在点对点通信、微服务、跨语言通信等领域应用很广&#xff0c;下面介绍grpc在windows10上编译&#xff0c;这里以编译grpc …

肖sir__xftp安装使用__004

xftp 一、定义&#xff1a;Xftp是一款功能强大的FTP传输软件&#xff0c;主要用于文件的上传和下载&#xff0c;支持SFTP和FTP协议。Xftp在Windows系统上设计&#xff0c;但也可在Linux系统上使用。本文将详细介绍Xftp的功能和使用方法 二、Xftp的功能 1.文件传输与管理&#…

递归算法学习——电话号码的字母组成,括号生成,组合

目录 一&#xff0c;电话号码的字母组合 1.题意 2.例子 3.题目接口 4.解题代码和思路 代码&#xff1a; 思路&#xff1a; 二&#xff0c;括号的生成 1.题意 2.例子 3.题目接口 四&#xff0c;解题代码和思路 1.先写代码&#xff1a; 2.思路 三&#xff0c;组合 …

udig下载、安装及汉化,生成geoserver图层样式sld文件

uDig是一款开源免费的桌面地理信息系统框架软件。uDig汉化版主要采用RCP技术构建&#xff0c;内置的多专业的水文工具&#xff0c;拥有复杂专业的分析能力&#xff0c;既可以作为独立程序运行&#xff0c;还可以作为插件使用。 uDig是一个 open source (EPL and BSD) 桌面应用程…

volatile 关键字 与 CPU cache line 的效率问题

分析&回答 Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存&#xff0c;那么按照64B的缓存单位大小来算&#xff0c;这个一级缓存所能存放的缓存个数就是512/64 8个。具体参见下…