python 包(package)和模块(module)的创建和引入(import

名词解释

实际上,Python中的函数(Function)、类(Class)、模块(Module)、包库(Package),都是为了实现模块化引用,让程序的组织更清晰有条理。

通常,函数、变量、类存储在被称为模块(Module)的.py文件中,一组模块文件又组成了包(Package)。

将函数、变量、类存储在存储在独立的.py文件中,可隐藏代码实现的细节,将不同代码块重新组织,与主程序分离,简化主程序的逻辑,提高主程序的可读性。

有了包和模块文件,可以在其他不同程序中进行复用,还可以使用其他人开发的第三方依赖库。


本引用为CSDN博主「虾米小馄饨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Bit_Coders/article/details/119318000

package实际上就是就是一个文件夹,里面包含诸多module和一个__init__.py,package是module的一种,这点在python报错的时候也能看出来。

引入方式

  1. import moduleName
  2. import packageName
  3. from packageName import moduleName\packageName
  4. from moudleName import Function\Class

引入父级目录模块

sys.path 是 sys 模块中的内置变量。它包含一个目录列表,编译器将搜索所需的模块。

如果要引入父级模块,需要在引入之前需要在python的编译器的环境变量中添加当前文件父目录,然后再import,有两个添加方法

  1. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  2. sys.path.append("..")

建议使用第一个方法,第二个方法会在除pycharm以外的地方运行的时候造成错误,原因是sys.path.append("..")添加的是当前使用者所在目录的父目录,而不是当前这个文件的父目录。

util.hi是父级目录中的模块,引入方式如下:

import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import util.hi

注意事项

  • ️在没有from的情况下,moduleName的形式可以是通过附属关系按照packageName.moduleName使用。
  • 在有from的时候,import后面必须是包名称或者是函数名或者类名或者模块名。但是不能用.来表示层级关系,也就是说不能用向packageName.moduleName之类的用法,但是可以用,来区分不同的模块。
  • ️只有在有from的情况下,import后面才能跟函数名或者类名

示范

这是当前的环境

.
├── main.py
├── test
├── testproject
│ ├── __init__.py
│ ├── pa1
│ │ ├── __init__.py
│ │ └── hello.py
│ └── testproject.py
└── util

这是pa1目录下的hello.py,有一个函数hello和一个类HelloT

import sys

acb: str = "1232"

def hello():
print("hello world") class HelloT:
def __init__(self) -> None:
pass def hello(self):
print("call", sys._getframe().f_code.co_name)

正确示范

下面示范在根目录下,main.py的正确import示范

# 引入pa1包的hello.py模块
from testproject.pa1 import hello
# 引入pa1包
import testproject.pa1
# 引入hello.py模块
import testproject.pa1.hello
# 引入在testproject包的pa1包
from testproject import pa1
# 引入hello.py模块下的hello函数和HelloT类
from testproject.pa1.hello import hello,HelloT

错误示范

下面示范在根目录下,main.py的错误import示范,错误原因请对照注意事项

from testproject import pa1.hello
import testproject.pa1.hello.HelloT

使用方式

先看一下在引入默认模块(比如osmathrandom)的时候,使用被引入的模块的方式:

>>> import os
>>> os.path.abspath(".")
'C:\\Users\\苏月晟\\Desktop\\pythonProject1'
>>> import math
>>> math.pi
3.141592653589793
>>> import random
>>> random.random()
0.11531493534041015

使用引入基本上只有两个要求,一个是别重名,一个是使用引入的时候所使用的被引入模块名字必须是和import后面的一模一样,比如说使用了import testproject.pa1.hello,那么想使用hello模块的时候必须用testproject.pa1.hello而不是hello。如果是使用了from testproject.pa1 import hello来引入hello模块,则在使用hello模块的时候直接用hello

可以看一下下面的示例来具体了解其中的差异:

>>> import os.path
>>> path.abspath(".")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>> os.path.abspath(".")
'C:\\Users\\苏月晟\\Desktop\\pythonProject1'
>>> from os import path
>>> path.abspath(".")
'C:\\Users\\苏月晟\\Desktop\\pythonProject1'

使用模块中的常量

只需要在模块中定义一个常量,然后在使用的时候用模块名.常量名就可以了,就像hello模块里面有一个常量acb,在引入hello模块之后,用hello.acb就可以调用常量acb

创建方式

创建包的时候,包目录里面必须有__init__.py,这个文件一般情况下可以是空的,具体这个文件怎么使用可以看Python init.py 作用详解 - Data&Truth - 博客园 (cnblogs.com)

看一下下面的目录结构

.
├── __init__.py
├── pa1
│ ├── __init__.py
│ └── hello.py
└── testproject.py

pa1是一个包,pa1目录下面有一个__init__.py,pa1下面还有一个hello.py,这个文件是一个模块。

hello.py

import sys

acb: str = "1232"

def hello():
print("hello world") class HelloT:
def __init__(self) -> None:
pass def hello(self):
print("call", sys._getframe().f_code.co_name)

这样就创建了一个模块。

LICENSE

署名-非商业性使用-相同方式共享 3.0 美国 (CC BY-NC-SA 3.0 US) 2021 苏月晟。

python 包(package)和模块(module)的创建和引入(import)的更多相关文章

  1. 【笔记】Python基础六:模块module介绍及常用模块

    一,module模块和包的介绍 1,在Python中,一个.py文件就称之为一个模块(Module). 2,使用模块的好处? 最大的好处是大大提高了代码的可维护性 其次,编写代码不必从零开始,我们编写 ...

  2. Python包和日志模块

    1.什么是包    包是模块的一种形式,包的本质就是一个含有__init__.py文件的文件夹 2.为什么要有包 提高开发人员维护性 3.如何用包    导入包就是在导包下的__init__.py   ...

  3. datastudion 资源导入python包,编写模块

    学习文档,不懂再问. https://help.aliyun.com/document_detail/74423.html?spm=a2c4g.11186623.6.688.72635debHqgkV ...

  4. day3-Python集合、函数、文件操作,python包的概念

    本节大纲: 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合. 2 包就是一个完成特定任务的工具箱. 3 包 ...

  5. python学习笔记十——模块与函数

    第五章 模块与函数 5.1 python程序的结构 函数+类->模块              模块+模块->包                 函数+类+模块+包=Python pyth ...

  6. python包的概念

    1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合. 2 包就是一个完成特定任务的工具箱. 3 包必须含有一个 ...

  7. Python(模块(modue)、包(package))

    ''' 一 模块 模块一共三种: python标准库 第三方模块 应用程序自定义模块 模块两种执行方式: 1 用于启动执行 2 用于被调用执行 key:import module: 将执行文件(mod ...

  8. python 包和模块

    一. 模块 使用内置函数vars()可以查看当前环境下有哪些对象(变量.函数.类) from 模块 import *: 不会导入以下划线开头的对象 只会导入__all__中定义了的对象(__all__ ...

  9. Python 包构建教程

    目录 setuptools 和 setup.py 你所需要做的事 & 一些概念 基础概念 关于源码分发文件和二进制分发文件 示例和分发选择 pure python module package ...

  10. Python包的相对导入时出现错误的解决方法

    在练习Python中package的相对导入时,即 from . import XXX 或者 from .. import XXX 时会遇到这样两个错误: SystemError: Parent mo ...

随机推荐

  1. 聊聊 PC 端自动化最佳方案 - Pywinauto

    1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...

  2. springboot:嵌套使用异步注解@Async还会异步执行吗

    一.引言 在前边的文章<[springboot:使用异步注解@Async的那些坑>中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误. 二.代码演示 下 ...

  3. Windows CMD .bat 批处理基础语法

    格式 @echo off 代码..... pause 不会逐行将命令打印. rem [注释] 关键字注释. :: [注释] 符号注释. echo 打印到控制台. >> 输出重定向.追加. ...

  4. 取消Ubuntu开机硬盘自检

    修改/etc/fstab文件,最后一列全改为0,测试能正常启动,尚未出现再次自检的情况 sudo gedit /etc/fstab

  5. MySQL5.7.24 安装

    官网地址 https://dev.mysql.com/downloads/mysql/ 1. 安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncu ...

  6. Python中的列表、元组、字典、字符串及切片操作

    我们引入一个新的概念:数据结构 数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或字符,甚至可以是其他数据结构,在python中,最基本的数据结构是序列,序列中的每个元素匾被分 ...

  7. js 中连续的 3 个点 three dots (...) in javascript

    这个叫扩展运算符 https://dev.to/sagar/three-dots---in-javascript-26ci 5 种用法 1 function myFunc(...[x, y, z]) ...

  8. 前后端数据交互(二)——原生 ajax 请求详解

    一.ajax介绍 ajax 是前后端交互的重要手段或桥梁.它不是一个技术,是一组技术的组合. ajax :a:异步:j:js:a:和:x:服务端的数据. ajax的组成: 异步的 js 事件 其他 j ...

  9. Spring系列之不同数据库异常如何抽象的?

    前言 使用Spring-Jdbc的情况下,在有些场景中,我们需要根据数据库报的异常类型的不同,来编写我们的业务代码.比如说,我们有这样一段逻辑,如果我们新插入的记录,存在唯一约束冲突,就会返回给客户端 ...

  10. C# 爬虫框架实现 流程_各个类开发

    目录链接:C# 爬虫框架实现 概述 对比通用爬虫结构,我将自己写的爬虫分为五个类实现: Spider主类:负责设置爬虫的各项属性 Scheduler类:负责提供URL到下载类,接收URL并做去重 Do ...