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

相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
116 80
|
1月前
|
Python
Python Internet 模块
Python Internet 模块。
124 74
|
20天前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
60 33
|
22天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
40 14
|
14天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
26 3
|
1月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
83 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
57 10
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
49 12