写了个系统,想把它上传到PyPI,以后可以直接使用pip install安装使用。
注册账号
在PyPI(https://pypi.org/)上注册账号,Register即可
所需python包要求
- setuptools
- wheel
- twine
项目结构
- module:项目名
- value***c:包名,包含要运行的主函数
- other、data、texts:均为需要用到的py文件和静态数据文件,如(.json, .txt...)
- value***c/__init__.py:最终运行的.py主程序文件夹,要包含该文件,可以为空,作用是指明主函数,否则无法加载
- README.md:(最终上传未使用,上传到PyPI还涉及到.md的格式转换)
- setup.py:打包的重要文件,元数据信息
- LICENSE:可以通过github创建时选择,协议要求
- MANIFEST.in:静态数据上传需求
setup.py (不能修改名字)
#!/usr/bin/env python
# coding: utf-8
import setuptools
#由于最终README.md还涉及到格式转换,暂未处理,因此,未将该文件上传
# with open("README.md", "r", encoding='UTF-8') as fh:
# long_description = fh.read()
setuptools.setup(
name="value***c", # 包的分发名称,使用字母、数字、_、-
version="1.5", # 版本号, 每次上传到PyPI后,版本后不再运行重复,版本号规范:https://www.python.org/dev/peps/pep-0440/
author="author", # 作者名字
author_email="author@qq.com", # 作者邮箱
description="description", # 包的简介描述
#long_description=long_description, # 包的详细介绍(一般通过加载README.md)
#long_description_content_type="text/markdown", # 和上条命令配合使用,声明加载的是markdown文件
url="https://github.com/author/value***c/tree/master", # 项目开源地址
packages=setuptools.find_packages(), # 包含在发布软件包文件中的可被import的python包文件。如果项目由多个文件组成,我们可以使用find_packages()自动发现所有包和子包,而不是手动列出每个包
include_package_data=True, # 打包包含静态文件标识!!上传静态数据时有用
classifiers=[ # 关于包的其他元数据(metadata)
"Programming Language :: Python :: 3", # 该软件包仅与Python3兼容
"License :: OSI Approved :: MIT License", # 根据MIT许可证开源
"Operating System :: OS Independent", # 与操作系统无关
],
install_requires=['py-L>=0.12.0', 'ter==3.1.0'], # 指定了当前软件包所依赖的其他python类库。这些指定的python类库将会在本package被安装的时候一并被安装
python_requires='>=3'
)
MANIFEST.in 上传静态数据!!!
程序运行常常需要静态数据,如json、txt等文件,此时需要该文件,以及setup.py里面 include_package_data=True
该项目中,我的数据都放在了data文件夹中,因此,MANIFEST.in文件具体示例如:
include data/*.json
表示还要打包上传data文件夹下的所有.json文件
文件中的静态数据读取路径,可能会和本地存在问题,尽可能使用类似
os.path.join(current_dir, '../data/words.json') #该语句在other/readWrite.py下运行,要调用data/words.json静态数据文件
的不会出错的路径。
打包,生成软件包文件,需setuptools和wheel
在该项目路径(上面示例为module)下,运行
python setup.py sdist bdist_wheel
运行结束后,会生成dist目录,包含相应的.whl文件和.tar.gz文件。其中.tar.gz文件是源文件,.whl是软件分发包 (build distribution) ,这两个文件是要上传到PyPI下的;还有value***c.egg-info目录,包含打包链接依赖信息等;以及build文件夹,结构如下:
上传到PyPI,需twine
在该项目路径(上面示例为module)下,运行
python -m twine upload dist/*
然后根据要求输入PiPI注册的账户和密码即可。
再在PyPI上登录,即可看到自己上传的包了
安装验证 (和其他python包无区别)
- 方法一:pip install value***c
- 方法二:进入网页https://pypi.org/project/value***c/#files, 下载.whl文件,进入下载后该文件保存路径,执行pip install ***.whl
- 方法三:仍进入该网页,下载.tar.gz文件,解压后进入目录,执行python setup.py install
使用方法
import value***c
value***c.main.function(参数)
#执行的是value***c文件夹下的main.py文件中的function(参数)函数
更新后上传
项目等一系列信息修改,重新打包+上传即可,注意,上传需修改版本号,同时删除旧的不需要的版本,否则安装包时需要加上版本号
python setup.py sdist bdist_wheel
python -m twine upload dist/*
注意:
1、文件夹位置要求,setup.py必须放在所有的文件夹外,module内,但和setup.py同级不能存在其他的.py,否则会发生能pip install,pip list也存在,但无法import的情况,即安装到的site-packages下只有一个dist-info文件夹,没有.py那个文件夹
2、查看具体安装后的包要如何使用,可以用python -m site查看安装后的site_packages位置,然后进入,查看安装的包具体内容。或者pip uninstall 包,会弹出是否确定删除,可以看到都安装了什么,然后位置在哪
3、.py文件需要改路径,基于setup.py下,所以所有的.py引用全需要加上其所在文件夹,即import folder.**.py as **.py。还有文件的路径引用,基本上全都要改
4、setup.py中的python_requires='>=3' 为要求python版本>=3,如果有更细致的要求写法:
# 大于等于3
python_requires='>=3'
# 大于等于3.3,但是不能超过4
python_requires='~=3.3'
# 不能用3.1,3.2
python_requires='!=3.1.*, !=3.2.*'