Python编程:twine模块打包python项目上传pypi

简介: Python编程:twine模块打包python项目上传pypi

注册账号(重要)

https://pypi.org


可以配置到$HOME/.pypirc文件中,就不用多次输入了


[pypi]
username = <username>
password = <password>

windows可以参考我之前的文章

Python编程:为世界贡献你的轮子-pipy打包


创建项目

创建一个名为 example_pkg 的项目,目录结构如下


example_pkg
  /example_pkg
    __init__.py

编辑文件 example_pkg/__init__.py


name = "example_pkg"

创建包文件

/example_pkg
  /example_pkg
    __init__.py
  setup.py
  LICENSE
  README.md

创建 setup.py

按照自己的信息,逐项填写即可


import setuptools
import os
import requests
# 将markdown格式转换为rst格式
def md_to_rst(from_file, to_file):
    r = requests.post(url='http://c.docverter.com/convert',
                      data={'to':'rst','from':'markdown'},
                      files={'input_files[]':open(from_file,'rb')})
    if r.ok:
        with open(to_file, "wb") as f:
            f.write(r.content)
md_to_rst("README.md", "README.rst")
if os.path.exists('README.rst'):
    long_description = open('README.rst', encoding="utf-8").read()
else:
  long_description = 'Add a fallback short description here'
if os.path.exists("requirements.txt"):
    install_requires = io.open("requirements.txt").read().split("\n")
else:
    install_requires = []
setuptools.setup(
    name="chinesename",
    version="0.0.8",
    author="Peng Shiyu",
    license = 'MIT License',  
    author_email="pengshiyuyx@gmail.com",
    description="get a chinesename by random",
    long_description=long_description,
    long_description_content_type="text/x-rst",
    url="https://github.com/mouday/chinesename",
    packages=setuptools.find_packages(),
    classifiers=(
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ),
    install_requires = install_requires,       # 常用
    # include_package_data=True,  # 自动打包文件夹内所有数据
    # 如果需要包含多个文件可以单独配置 MANIFEST.in
    package_data = {
            # If any package contains *.txt or *.rst files, include them:
            'chinesename': ['source/*.txt', "source/*.json"],
    },
    # 如果需要支持脚本方法运行,可以配置入口点
     entry_points={
        'console_scripts': [
            'chinesename = chinesename.run:main'
        ]
    }
)

关于setup.py文件可以参考官方给的例子:

https://github.com/pypa/sampleproject/blob/master/setup.py


创建 README.md

建议写的详细些,展示你项目的主要介绍


# Example Package
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

官网上说支持markdown格式,可是显示不正确,可以将.md文件转为.rst文件, 也有推荐说使用 Pandoc装换,我没成功,所以使用了setup.py中的方法


Have the same README both in Markdown and reStructuredText


生成目录树,添加文件目录说明:


tree /F > tree.txt

创建 LICENSE

可以忽略


可参考:https://choosealicense.com/


Copyright (c) 2018 The Python Packaging Authority
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

生成发布压缩包

确保已经安装setuptools 和 wheel


python3 -m pip install --user --upgrade setuptools wheel

setup.py文件同目录命令行下运行


python3 setup.py sdist bdist_wheel

产生两个文件


dist/
  example_pkg-0.0.1-py3-none-any.whl
  example_pkg-0.0.1.tar.gz

tar.gz 源文件

.whl 分发文件


检查打包的文件是否正常


python setup.py install  # 安装

按照使用方式导入测试,没问题后继续


上传文件

安装twine


pip install twine

上传


twine upload dist/*

没有报错就成功了


Uploading distributions to https://test.pypi.org/legacy/
Enter your username: [your username]
Enter your password:
Uploading example_pkg-0.0.1-py3-none-any.whl
100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example_pkg-0.0.1.tar.gz
100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]

安装你刚刚上传的包

pip install -i https://test.pypi.org/simple/ example_pkg

导入测试

>>> import example_pkg
>>> example_pkg.name
'example_pkg'

总结

发布项目分三步


配置setup.py文件

打包项目

发布项目

python setup.py sdist bdist_wheel
twine upload dist/*

建议

1、打包流程

打包过程中也可以多增加一些额外的操作,减少上传中的错误


# 先升级打包工具
pip install --upgrade setuptools wheel twine
# 打包
python setup.py sdist bdist_wheel
# 检查
twine check dist/*
# 上传pypi
twine upload dist/*
# 安装最新的版本测试
pip install -U example_pkg -i https://pypi.org/simple

2、关于markdown 格式的readme文件

from setuptools import setup
# read the contents of your README file
from os import path
this_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f:
    long_description = f.read()
setup(
    name='an_example_package',
    # other arguments omitted
    long_description=long_description,
    long_description_content_type='text/markdown'
)

3、关于多文件打包

添加文件 MANIFEST.in,大致内容如下, 会将用到的文件都打包进来
include README.md
include requirements.txt
graft spideradmin/static
graft spideradmin/templates
global-include *.py
global-exclude *.pyc

4、常用的打包设置

setup.py 示例
# -*- coding: utf-8 -*-
import io
from setuptools import setup, find_packages
VERSION = '0.0.6'
with io.open("README.md", 'r', encoding='utf-8') as f:
    long_description = f.read()
setup(
    name='spideradmin',
    version=VERSION,
    description="a spider admin based scrapyd api and APScheduler",
    keywords='spider admin',
    author='Peng Shiyu',
    author_email='pengshiyuyx@gmail.com',
    license='MIT',
    url="https://github.com/mouday/SpiderAdmin",
    long_description=long_description,
    long_description_content_type='text/markdown',
    classifiers=[
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.6"
    ],
    packages=find_packages(),
    include_package_data=True,
    zip_safe=True,
    install_requires=[
        "requests>=2.22.0",
        "Flask>=1.0.3",
        "APScheduler>=3.6.0",
        "tinydb>=3.13.0",
        "Flask-BasicAuth>=0.2.0"
    ],
    entry_points={
        'console_scripts': [
            'spideradmin = spideradmin.run:main'
        ]
    }
)

相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
386 7
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
273 0
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
219 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
483 3
|
2月前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
404 4
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
301 3
|
2月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
312 0
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
220 0
|
Java Shell API
实战教程:如何将自己的Python包发布到PyPI上
实战教程:如何将自己的Python包发布到PyPI上
3843 0
实战教程:如何将自己的Python包发布到PyPI上

推荐镜像

更多