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

Python-Packages

我们根据一些逻辑,创建一些文件夹、子文件夹来存放相应文件,从而我们能够更方便地管理文件。
同样的,python中的包(packages)也采取了模块化的逻辑结构。

  • 模块(module):实际上就是我们所写的每一个.py文件,其中能够包含多个对象,如类、函数等。
  • 包(package):包含多个相关模块的文件夹。

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

  • 创建一个文件夹,命名为“MyApp”,我将其放在了桌面上,路径为C:\Users\自己的用户名\Desktop
  • 在MyApp文件夹里创建一个子文件夹,名为‘mypackage’。
  • 在mypackage文件夹中创建一个空__init__.py文件。
  • 再在mypackage下创建greet.pyfunctions.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

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

>>> from mypackage.functions import sum
>>> sum(3,6)
9
>>> average(12,34)
Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘average’ is not defined


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

  • 当一个文件夹中包含__init__.py文件时,python的解释器会将其认作包。
  • __init__.py描述了从模块导入的特定资源。

通常__init__.py文件是空的。然而它可以被用来选择模块中特定的函数,从而在import包名之后就可以直接调用这些函数
例如:

# __init__.py
from .functions import average, power
from .greet import SayHello

__init__.py文件中加入如上代码后,就可以直接从包import相应函数了,相当于越过了包中模块的这一层逻辑结构。

>>> from mypackage import average, power, SayHello
>>> SayHello(‘World’)
>>> Hello World

Python中_init_.py是package的标志。init.py 文件的一个主要作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。在python中导入一个包时,实际上是导入了它的__init__.py文件,这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
如:

# 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='[email protected]',
license='MIT',
packages=['mypackage'],
zip_safe=False)
  • 在包的父文件夹"MyApp"中创建一个setup.py的文件,粘贴上述代码与此文件中。
    这个脚本文件从setuptools模块调用setup()函数,设置相关参数。

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

python setup.py build

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

python setup.py sdist

这时MyApp文件夹中出现了dist文件夹。
其中可以安装和发布的压缩文件在dist文件夹中。

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

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

至此便安装成功。


总结

若想使用某包某函数,首先要了解这个包的逻辑结构。若想直接调用某函数,则需要直接import过这个函数,或者包中的__init__.py的文件已经帮你将相应函数import过。

总而言之

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

  • 只需要根据逻辑结构,分层级地from A import B即可使用B( )
    import A.B,则不可使用B( ),只能使用A.B( )

猜你喜欢

转载自blog.csdn.net/fakejvruo/article/details/124322848