教师妹学python之十:共享代码
10.1 PyPi是什么?
PyPi 是 Python Package Index 的首字母简写,其实表示的是 Python 的 Packag 索引,这个也是 Python 的官方索引。
你需要的包(Package)基本上都可以从这里面找到。作为开源软件,你也希望能够贡献你的 Package 到这里供其他用户使用。我们举个栗子,如果你希望你的 Python 程序能够下载金融数据,目前比较好用的金融数据来源是 Yahoo 和 Google。你可能需要读取这 2 个平台的 API,然后做一个下载部分的代码,然后将这个代码整合到自己的项目中。是不是好麻烦,这样你可以到 PyPi 到上面去找找有没有人已经写过这个内容了,幸运的是,你真找到了,你找到了一个 package 叫做 yfinance。但是这个代码在远程,没有在本地呀,怎么用了?
你就需要将需要的内容从 PyPi 上下载下来引用即可。
安装模块的指令:
pip install yfinance
10.2 共享你的代码
10.2.1 函数转换为模块
编写代码,随便写了一个判断奇数的函数
#!/usr/bin/env python3 # _*_ coding: utf-8 _*_ # @Author : qa.yw # @Time : 2021/3/30 11:19 # @File : isOdd.py # @desc : 判断奇数函数 ''' 此函数判断num是否属于奇数 ''' def isOddNum(num): if num % 2 == 0: return False else: return True
代码保存到isOdd.py文件中。
10.2.2 准备发布
为了共享isOdd.py这个模块,需要准备一个发布。在Python中,发布(distribution)是指一个文件集合,这些文件联合在一起允许你构建、打包、和发布你的代码。
- 为模块创建一个文件夹 isOdd,将isOdd.py复制到文件夹。
- 在isOdd文件夹中创建一个"setup.py"文件,这个文件包含有关发布的元数据。
from distutils.core import setup setup( name='isOdd', version='1.0.0', py_modules=['isOdd'], author='qa.yw', author_email='byteflow@163.com', url='https://www.baidu.com', description='A function judging odd' )
python3 setup.py check, 检查setup.py文件是否规范。
10.2.3 构建发布
现在已经有一个文件,里面包含两个文件:模块代码在isOdd.py文件,模块的元数据在setup.py文件。
- 构建一个发布文件,在isOdd文件夹下打开一个终端,执行命令:python3 setup.py sdist
$ python3 setup.py sdist running sdist running check warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) warning: sdist: standard file not found: should have one of README, README.txt, README.rst writing manifest file 'MANIFEST' creating isOdd-1.0.0 making hard links in isOdd-1.0.0... hard linking isOdd.py -> isOdd-1.0.0 hard linking setup.py -> isOdd-1.0.0 creating dist Creating tar archive removing 'isOdd-1.0.0' (and everything under it)
- 将发布安装到你的Python本地副本中,执行命令:sudo python3 setup.py install
$ sudo python3 setup.py install running install running build running build_py creating build creating build/lib copying isOdd.py -> build/lib running install_lib copying build/lib/isOdd.py -> /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages byte-compiling /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/isOdd.py to isOdd.cpython-37.pyc running install_egg_info Writing /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/isOdd-1.0.0-py3.7.egg-info
发布介绍
利用Python发布工具,你的模块已经转换为一个发布,并且安装到你的Python本地副本上。
MANIFEST-这个文件包含发布中的文件列表
build文件-新增的文件夹
dist-发布包
- 通过上述操作,你的模块已经可以在本地引用了。
10.2.4 注册PyPi网站
当然上述你的模块仅仅只是在本地可以引用,但是其他人还不能引用你的模块,如果能让全世界的人都能用你的模块,你就要向PyPi上传你的发布。PyPI · The Python Package Index
10.2.5 向PyPi上传代码
方法1:
- 执行 python3 setup.py register
$ python3 setup.py register running register running check We need to know who you are, so please choose either: 1. use your existing login, 2. register as a new user, 3. have the server generate a new password for you (and email it to you), or 4. quit Your selection [default 1]: 1 Username: qa.yw Password: Registering isOdd to https://upload.pypi.org/legacy/ Server response (500): <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)>
- 执行 python3 setup.py sdist upload
方法2:
使用twine上传你的项目
pip3 install twine
- python3 setup.py sdist
python3 setup.py sdist
- twine upload dist/*
$ twine upload dist/* Uploading distributions to https://upload.pypi.org/legacy/ Enter your username: qa.yw Enter your password: Uploading isOddNum-1.0.0.tar.gz 100%|███████████████████████████████████████████████████████████████████████████████████████| 3.49k/3.49k [00:02<00:00, 1.70kB/s] View at: https://pypi.org/project/isOddNum/1.0.0/
- 安装
$ pip3 install isOddNum Requirement already satisfied: isOddNum in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.0.0)¥
10.2.6 增加README.md
import setuptools
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setuptools.setup(
name='lib-name',
version='1.0',
author='',
author_email='',
description='',
long_description=long_description,
long_description_content_type="text/markdown",
url='',
packages=setuptools.find_packages(),
data_files=[('diractory',['file'])],
install_requires=[
'tensorflow>=2.2.0',
'keras>=2.4.0',
'numpy',
]
)