Python编程——模块、包和__init__.py

1. 模块

Python中的一个文件即为一个模块(Module),一个模块引用另外一个模块的变量、函数或类时,使用import来导入。模块名即文件名。

fibo.py 文件下有如下代码:

python 复制代码
    def fib(n):    # write Fibonacci series up to n
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a+b
        print()

那么在main.py文件中如下使用fibo模块。

python 复制代码
    import fibo
    
    fibo.fib(100)

或者直接导出指定函数,此方法可能导致同名函数被覆盖导致代码异常。

python 复制代码
    from fibo import fib
    
    fib(100)

2. 包

2.1. 基本用法

包(Package)是模块的一个集合,一个包中可以有多个子包。包名即目录名,包目录下必须包含__init__.py文件,否则只是一个多模块的文件夹。

在main.py中导入algo.real模块:

python 复制代码
    import algo.real 
    import algo.complex
    
    print(algo.real.add(1, 2))

python 复制代码
    from algo import real, complex
    
    print(real.add(1, 2))

2.2. 高级用法

2.2.1. 导入所有模块

如果包中的模块非常多,想一次全部导入包中的模块,则需要在__init__.py中指定所有导出的模块。为什么不建议__init__.py文件留空呢?留空默认表示导出所有包中的模块。如果包中有一些单元测试的模块,只用于开发自测。如果用户使用from XXX import *导入所有模块,就会导致单元测试模块也被执行,这是不符合用户预期的。所以包设计者应该显式在__init__.py中导出所有模块,避免这种可能的异常。

python 复制代码
    # coding=utf-8
    
    __all__ = ['real', 'complex']

然后在main.py中调用:

python 复制代码
    # coding=utf-8
    from algo import *
    # 导入algo包中的__init__.py模块中__all__记录的所有模块
    
    print(real.add(1, 2))
    print(complex.sub(2, 1))

3. 搜索路径

3.1. 模块搜索路径

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

  • 被命令行直接运行的脚本所在的目录(或未指定文件时的当前目录)。

  • PYTHONPATH (目录列表,与 shell 变量 PATH 的语法一样)。

  • 依赖于安装的默认值(按照惯例包括一个 site-packages 目录,由 site 模块处理)。

所以要增加搜索路径,可以在命令行中先行设置环境变量PYTHONPATH,再执行脚本即可。也可以在代码中

sys.path.append('/ufs/guido/lib/python')

3.2. 相对路径

当一个包有多个子包时,子包导入模块时,其默认路径并不是子包当前路径,此时如果想指定当前路径,则需要使用相对路径导入。

python 复制代码
    from . import sub_math
    # 从当前目录导入模块sub_math
    
    from .sub_pack import *
    # 从当前目录的子包sub_pack中导入所有模块
    
    from .. import utils
    ## 从上级目录导入模块utils
    
    from ..filters import equalizer
    # 从上级目录的包filters中导入模块equalizer
相关推荐
兵慌码乱7 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵9 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio13 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636714 小时前
使用 Python 从零创建 Word 文档
python
Csvn18 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽19 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175321 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei2 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python