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'
        ]
    }
)

相关文章
|
10天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
13 4
|
1天前
|
设计模式 程序员 数据处理
编程之旅:探索Python中的装饰器
【10月更文挑战第34天】在编程的海洋中,Python这艘航船以其简洁优雅著称。其中,装饰器作为一项高级特性,如同船上的风帆,让代码更加灵活和强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一起感受编程之美。
|
3天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
13 5
|
1天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
10 1
|
1天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
14 2
|
3天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
8天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
8天前
|
数据处理 Python
从零到英雄:Python编程的奇幻旅程###
想象你正站在数字世界的门槛上,手中握着一把名为“Python”的魔法钥匙。别小看这把钥匙,它能开启无限可能的大门,引领你穿梭于现实与虚拟之间,创造属于自己的奇迹。本文将带你踏上一场从零基础到编程英雄的奇妙之旅,通过生动有趣的比喻和实际案例,让你领略Python编程的魅力,激发内心深处对技术的渴望与热爱。 ###
|
10天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
15 1