Advertisement

Python-Packages——如何创建一个自己的包?

阅读量:

Python-Packages

我们基于一定的逻辑建立了若干文件夹与子文件夹,并对相应文件进行了归类存储,在此基础之上实现了更加便捷的文件管理方式。类似的,在Python编程语言中各个包(packages)均遵循模块化设计原则运作。

  • 模块(module) :实际上就是我们所写的每一个模块(如.py文件),其中能够实现多个对象或实体。
    • 包(package) :包含多个相关模块的集合或结构。

现在让我们来创建一个自己的包。

用户要求我建立一个新的项目根目录,命名为"MyApp"并将其放置于桌面位置,其路径由系统环境变量C:\Users\Username.desktop确定.
用户指示我在此项目根目录内部新增一个子目录,其名称定义为'mypackage'.
用户指示于mypackage目录内新增一个空的初始化.py脚本.
用户指示另外,在mypackage目录下新增两个Python模块:greet.py和functions.py,并在其各自位置插入相应的代码内容.

复制代码
    #greet.py
    def SayHello(name):
    print("Hello ", name)
    
    
      
      
      
    
    代码解读
复制代码
    #functions.py
    def sum(x,y):
    return x+y
    
    def average(x,y):
    return (x+y)/2
    
    def power(x,y):
    return x**y
    
    
      
      
      
      
      
      
      
      
      
    
    代码解读

至此,我们就创建了一个叫做mypackage的包,结构如下:

在这里插入图片描述

从包中导入模块
  • 在MyApp中打开终端命令行,并且运行python
在这里插入图片描述

C:\Users\用户名\Desktop\MyApp> python

  • 从mypackage包中导入functions模块,并运行它的power()函数。

from mypackage import functions
functions.power(2,10)
1024

  • 也可以从包里的模块中导入相应函数

import sum from mypackage.functions
sum the values 3 and 6
9
calculate the average of 12 and 34
An error occurred when trying to compute the average of 12 and 34.


__init__.py是一个包中的特殊文件,它存储着包的内容,并且有两个目的:

  • 如果一个文件夹中包含__init__.py文件,则python的解释器会将其被识别为该包所在目录下的一个包。
    • __init__.py负责管理从该模块导入的各种资源。

改写内容

复制代码
    # __init__.py
    from .functions import average, power
    from .greet import SayHello
    
    
      
      
      
    
    代码解读

在导入位于__init__.py文件中的相关代码后, 就可以直接从包导入相应的函数了, 相当于跳过了包内模块这一层逻辑结构。

导入模块mypackage中的函数average、power和SayHello
向SayHello函数传递参数'World'
输出结果为Hello World

在Python编程语言中,init.py文件是表示软件包的一个标志文件;而初始化脚本(即_init_.py)的主要功能之一则是将目录转换为可被Python识别的模块;每个软件包在其所属目录下均包含有唯一的初始化脚本;当在Python环境中导入一个软件包时,默认也会加载其所属目录下的初始化脚本;从而使得我们可以在一个初始化脚本中一次性导入所需的子模块

复制代码
    # package
    # __init__.py
    import re
    import urllib
    import sys
    import os
    # a.py
    import package
    print(package.re, package.urllib, package.sys, package.os)
    
    
    
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全局安装一个包

在创建了包之后,就可以通过执行相应的安装脚本将其在系统范围内部署使用。该脚本将从库集中的setuptools模块中调用setup()函数以完成操作。

复制代码
    # setup.py
    from setuptools import setup
    setup(name='mypackage',
    version='0.1',
    description='Testing installation of Package',
    url='#',
    author='auth',
    author_email='author@email.com',
    license='MIT',
    packages=['mypackage'],
    zip_safe=False)
    
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

为了便于管理项目的依赖关系,在项目的根目录'MyApp'中生成一个'setup.py'执行文件,并附加前述代码内容。该执行文件将通过导入setuptools模块并调用其中的setup()函数来完成必要的配置操作。

在命令行的父文件夹路径中使用

python setup.py build

这时父文件夹MyApp中出现了build文件夹。
再在命令行输入

python setup.py sdist

此时,在MyApp目录下新增了一个名为dist的子目录

  • 现在使用 pip 工具来安装 mypackage 。
    确保命令行路径在包的父文件夹中。

pip install C:\xxx\MyApp\dist\mypackage-0.1.tar.gz

至此便安装成功。


总结

为了使用某个包里的某个功能模块(即该包的逻辑结构),开发者必须先熟悉该包的整体架构,并了解如何访问其中的功能模块。如果要直接调用某个特定的功能模块,则必须先通过import语句引入该模块,并确保在运行时路径正确无误。

总而言之

__init__.py中的代码用来越过逻辑结构层级。

根据逻辑结构分层导入的方式...即可调用B函数。
当直接导入A.B时,则无法调用B函数。

全部评论 (0)

还没有任何评论哟~