博客
关于我
Python语法学习记录(4):import详解 创建自己的包 跨文件夹引用包
阅读量:491 次
发布时间:2019-03-07

本文共 3630 字,大约阅读时间需要 12 分钟。

Python 模块导入基础与进阶交流

在 Python 编程中,模块是代码组织的基本单元,通过导入模块可以在程序中使用其他开发者编写的功能模块,从而提高代码复用性和开发效率。本文将从模块导入的基础知识入手,逐步探讨模块的创建、包的组织、跨文件引用等高级内容。


一、模块导入基础

在 Python 中,模块间的导入主要通过两种方式实现:importfrom...import

  • import 语句的使用

    import 语句用于将整个模块导入到当前程序中。一个典型的导入方式如下:

    import sys

    这将将 sys 模块注册到当前程序的全局符号空间中,之后可以通过 sys 调用模块中的函数或类。

  • from...import 语句的使用

    如果你只需要导入模块中的特定功能,可以使用 from...import 语句。例如:

    from folder1.folder2 import filename

    或者:

    from filename import my_function
  • 命名冲突的解决

    在项目开发中,模块名可能会存在冲突。为避免这种情况,可以指定导入后的模块名称:

    from folder1.folder2.filename import my_function as my alias

    这样可以让不同的模块使用相同的功能名,同时不影响已有功能名的使用。

  • 默认导入与 all 规则

    当使用 from...import * 时,模块中所有非私有符号(即不以 _ 开头的符号)都会被导入。如果希望控制导入的内容,可以通过定义模块的 __all__ 列表来实现:

    __all__ = ['my_function', 'my_class']

    这会使得只有定义在 __all__ 中的符号被导入,其他符号将不会暴露在导入的程序中。


  • 二、模块与包的创建

  • 模块的创建

    模块是 Python 中最基本的代码组织单元。简单的模块文件结构如下:

    # mymodule.pyversion = '1.0'def say_hello():    print('Hello World')

    创建一个新模块后,需要将其包含在项目的 sys.path 监控路径中。可以通过以下方式添加:

    import sysimport ossearch_path = '/home/username/my_project'if search_path not in sys.path:    sys.path.append(search_path)
  • 包的组织

    在项目开发中,模块通常被组织成一个或多个包。一个典型的包结构如下:

    project/├── __init__.py└── test1/    ├── __init__.py    ├── one.py    └── two.py
    • __init__.py 文件是包的标识文件,标记该目录为一个包。
    • 子模块 (one.py, two.py) 可包含模块功能或其他基础功能清单。
  • 使用包模块

    导入包中的模块有多种方式:

    import test1from test1 import onefrom test1.one import afrom test1 import *

    需要注意的是,在使用 from test1 import * 时,书写 __init__.py 文件中的 __all__ 列表才可以控制导入内容。


  • 三、模块间的依赖与引用

  • 子模块的导入

    在包结构中,子模块之间的调用需要根据包路径进行适当的调整。例如,同一包内的子模块:

    from . import onefrom .. import two

    如果需要使用外部包内的模块,可以使用完整路径:

    from test1.model import four
  • 模块间的依赖管理

    在项目中,模块之间的依赖关系需要通过引用路径明确。这种情况下,可以通过跨文件导入解决:

    import syssys.path.append('/home/username/project')from test1.model import Three

    需要注意的是,sys.path 的修改只会影响当前进程,不能通过这种方式永久保存模块导入路径。

  • Python 运行时的模块搜索路径

    Python 的模块搜索路径主要由以下组成部分决定:

  • 程序本身所在目录。
  • 系统定义的 PYTHONPATH 环境变量。
  • 标准库目录(通常位于 /usr/local/…/Python/)。
  • 加载过的 .pth 文件中的模块路径。
  • 通过修改 sys.path 或设置环境变量,可以将自定义路径添加到模块搜索路径中。


    四、模块导入的高级功能

  • 模块导入的并发优化

    在大型项目中,模块的导入往往需要优化,以减少运行时的性能消耗。Python 提供了两个关键模块来帮助实现这一目的:

    • importlib:提供了对模块导入的低级控制,可以用于批量导入模块。
    • sys 模块的 modules 列表:用于跟踪模块加载状态。
  • 模块的卸载与重新加载

    有时需要在程序运行后卸载某些模块,以应对环境变化。可以通过以下方式实现:

    import syssys.modules['module_name'].__dict__.clear()sys.path.pop(index)
  • 包模块的扩展与自定义

    在项目中可以创建自定义的包格式,通过 __init__.py 文件定义包结构,并通过 __all__ 控制导入内容。这种方式可以帮助维护模块的组织和调用。


  • 五、模块导入的综合实践

  • 模块导入路径的设置

    会话路径的设置通常通过以下方式实现:

    import syssys.path.append(LIB_PATH)

    这样可以让程序在运行时访问到指定目录下的模块文件。

  • 包模块的长期有效性

    如果需要将模块导入路径固定下来,可以通过以下方式实现:

    echo '/home/username/LIB_PATH' > ~/.bash_profilesource ~/.bash_profile

    这种方法会将指定路径添加到运行时的模块搜索路径中。

  • 跨环境模块调用

    在不同环境之间共享模块时,可以通过以下方式实现:

    export PYTHONPATH='/path/to/shared_packages:$PYTHONPATH'

    这样,可以确保在不同的环境下,模块导入路径保持一致。


  • 六、模块导入与性能优化

  • 模块导入的延迟加载

    在大型项目中,模块的初始导入往往是性能开销较大的操作。使用延迟加载(Lazy Loading)技术,可以减少初始导入的性能消耗。

    import sysfrom lazypy import LazyLoader# 在类中定义一个装饰器class MyLoader(LazyLoader):    @LazyLoader    def my_module(self):        return self.load('my_module')my_instance = MyLoader()print(my_instance.my_module())  # weights下时会自动导入
  • 模块的分布式引用

    在分布式环境中,模块的引用可以通过以下方式实现:

    import grpcfrom module_pb2 import MyModuleimport my_module_pb2 as my_pbwith grpc.client('localhost:1234') as client:    request = MyModule.Request()    response = my_module_pb2.MyModule.MyServicePB(        request=my_module    ).Si

    通过集中管理模块,可以实现模块的分布式调用。

  • 模块导入的缓存控制

    模块导入结果可以通过 sys 模块的缓存机制来控制:

    import syssys.modules.cache_update()sys.settracefunction()

    这可以帮助开发者控制模块导入的缓存行为,减少不必要的重复导入。


  • 七、总结与展望

    模块导入是 Python 开发 中的核心技能之一。通过掌握模块的创建、包的组织以及模块之间的依赖关系,可以显著提升代码的复用性和开发效率。随着项目规模的不断扩大,模块导入的复杂性也在不断增加。因此,深入理解 Python 的模块导入机制,并掌握高级模块管理工具,将是每一个 Python 开发者的必修课。

    未来,随着 Python 3 的普及以及包管理工具(如 poetrypipenv)的发展,模块导入和依赖管理的方式也在不断演变。学习和探索这些新工具,将为你的 Python 开发 之旅带来更多可能性。

    转载地址:http://oqfcz.baihongyu.com/

    你可能感兴趣的文章
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>