摘要
书接前文:
01-《零基础编程——起步并搭建Python环境》及图书推荐
02-《零基础编程——变量与数据类型》
03-《零基础编程——Python循环、函数、类》
04-《零基础编程——Python文件、JSON数据存储》
05-《零基础编程——Python标准库使用》
本文将讲解Python模块打包封装成为第三方库并且及发布到pypi,可以使用pip安装使用
内容:
一 模块创建使用 1-创建一个模块(文件),命名为:fibo.py 2-调用使用模块 3-将模块作为脚本执行二 包创建使用 Python Package 1-创建包 2-为什么需要__init__.py文件?三 打包Python项目为第三方库 1-给包、项目添加setup.py文件并打包发布 2-安装到python模块中 3-使用自己刚才打包的模块四 发布包到PyPI 1-PyPi注册自己的账号 2-校验我们打的包 3-在用户目录下创建认证信息 4-上传发布 5-安装使用五 技术总结及源码地址
一 模块创建使用
1-创建一个模块(文件),命名为:fibo.py
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()def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result
2-调用使用模块
import fibofibo.fib(1000)dir(fibo)#查看fibo模块的方法fibo.__name__
from fibo import * #这种方式导入模块,这会导入除以下划线(_)开头的所有名称之外的所有名称,一般我们用这种方式导入。
为了加快模块的加载速度,Python将每个模块的编译版本缓存在__pycache__名称下的目录中,该版本对编译文件的格式进行编码;它通常包含Python版本号.而将模块作为执行脚本的方式执行,不会产生缓存。
3-将模块作为脚本执行
修改fibo.py的__name__方法,代码如下:
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()def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return resultif __name__ == "__main__": import sys fib(int(sys.argv[1]))
命令行进入该文件目录,并执行:python fibo.py 1000
格式为
python fibo.py
运行结果如下:
二 包创建使用 Python Package
1-创建包
创建一个fibo文件夹,新建一个__init__.py文件,该__init__.py文件通常为空,也可以用__all__则将其模块函数名称的列表。同样建立子文件夹fibo1、fibo2,下面分别有__init__.py和fibo.py
fibo.py 代码:
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()def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return resultif __name__ == "__main__": import sys fib(int(sys.argv[1]))
调用包(使用)
#方式1import fibo.fibo1.fibo fibo.fibo1.fibo.fib(1000)#方式2from fibo.fibo1.fibo import fibfib(1000)
分析:
Python的package有两种方式:regular packages、 namespace packages.
regular package的方式需要有个__init__.py文件,当导入包时候会隐式执行__init__.py文件,该文件可以绑定包空间里面的方法名称、以及包含其他模块属性。一般都是空的,表示改包下面的所有方法。如果没有该文件,删除该__init__.py文件,Python将不再在该目录中查找子模块,因此尝试导入该模块将失败。
2-为什么需要__init__.py文件?
为方便起见:其他用户将不需要知道您的函数在包层次结构中的确切位置
your_package/ __init__.py file1.py file2.py ... fileN.py# in __init__.pyfrom file1 import *from file2 import *...from fileN import *# in file1.pydef add(): pass 然后其他人可以通过以下方式调用add()from your_package import add不知道file1,例如from your_package.file1 import add
如果您想初始化一些东西;例如,日志记录(应放在顶层):
import logging.configlogging.config.dictConfig(Your_logging_config)
三 打包Python项目为第三方库
1-给包、项目添加setup.py文件并打包发布
准备setup.py/setup.conf文件,它是放在你包的根目录的,这一步至关重要,包括要发布的包名字,版本,license,描述,特性(classifier)等等
setup.py格式如下:
from setuptools import setup, find_packagessetup( name='', version='', description=( '' ), long_description=open('README.rst').read(), author='', author_email='', maintainer='', maintainer_email='', classifiers=[ 'Development Status :: 4 - Beta', 'Operating System :: OS Independent', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: Implementation', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries' ],)
我们的setup.py内容如下:
from setuptools import setup, find_packagessetup( name="fibo", version="0.0.1", description=( "freso-studio,test packaging fibo" ), long_description=open("README.rst").read(), author="freostudio", author_email="1600690028@qq.com", maintainer="freostudio", maintainer_email="1600690028@qq.com", packages=find_packages(), url="https://github.com/freostudio/fibo", classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ],)
最终我们整个fibo的项目结构如下:
进入命令行控制台:进入该目录,打包一个源代码的包执行
#1-生产tar.gz的包python setup.py sdist build#2-或者执行生产wheels格式的包python setup.py bdist_wheel --universal
执行完后:会新增dist文件夹及test-fibo-0.0.1.tar.gz
fibo-0.0.1.tar.gz是我们可以安装的第三方库了
2-安装到python模块中
(可以拷贝到其他电脑测试使用)
test_fibo-0.0.1.tar.gz,命令行进入该目录,执行:
pip install fibo-0.0.1.tar.gz
3-使用自己刚才打包的模块
任意路径进入命令行
执行:
python#调用模块方式1import fibo.fibo1.fibo fibo.fibo1.fibo.fib(1000)#调用模块方式2from fibo.fibo1.fibo import fibfib(1000)
四 发布包到PyPI
1-PyPi注册自己的账号
正式发布:
测试发布:
2-校验我们打的包
再包目录下执行命令:python3 setup.py check
没有报错即可,输出一般是running check,如果有错误或者警告,就会在此之后显示.没有任何显示表示Distutils认可你这个setup.py文件
3-在用户目录下创建认证信息
windows路径:/user/用户名/新建文件.pypirc文件
[distutils]index-servers = pypi pypitest[pypi]repository: https://upload.pypi.org/legacy/username: your_usernamepassword: your_password[pypitest]repository: https://test.pypi.org/legacy/username: your_usernamepassword: your_password
4-上传发布
进入刚才我们打包的路径下执行命令
python setup.py sdist upload -r pypitest##成功上传测试环境后再执行发布到正式环境python3 setup.py sdist upload -r pypi
执行结果如下:
报错:
Upload failed (403): The user 'freostudio' isn't allowed to upload to project 'fibo'. See https://test.pypi.org/help/#project-name for more information.error: Upload failed (403): The user 'freostudio' isn't allowed to upload to project 'fibo'. See https://test.pypi.org/help/#project-name for more information.
到测试环境查fibo发现已经存在了,https://test.pypi.org/search/?q=fibo
只好我们换个包名:freostudio_fibo
到我们账号下面去查看package:已经上传成功
https://test.pypi.org/project/freostudio_fibo/
5-安装使用
我们先从测试环境中下载包看看
pip download freostudio_fibo -i https://test.pypi.org/simple/
安装到本地使用:
pip install freostudio_fibo -i https://test.pypi.org/simple/
成功安装
测试使用:
python#调用模块方式1import freostudio_fibo.fibo1.fibo as fbfb.fib(1000)#调用模块方式2from freostudio_fibo.fibo1.fibo import fib fib(1000)
成功调用
五 总结
学会创建模块、包,并且编译打包成安装包,注册PyPI账号,并且发布上传自己的包给别人用。