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函数。
