【python教程】打包和发布自己的项目,让别人去pip

news/2024/11/16 8:41:44/文章来源:https://www.cnblogs.com/UnderTurrets/p/18377676

@

目录
  • 1.环境搭建
    • 1.1 换源
    • 1.2 安装wheel
    • 1.3 安装twine
    • 1.4 注册PyPI账号
  • 2.编写setup.py
    • 2.1 项目文件树
    • 2.2 编写setup.py文件
  • 3.构建
  • 4.上传
    • ERROR:The user 'XXX' isn't allowed to upload to project ''
    • 2024.1.19更新:


1.环境搭建

1.1 换源

  • 在pip安装时使用-i参数,可以指定源。以下有许多种国内源可以选择
https://pypi.tuna.tsinghua.edu.cn/simple
http://mirrors.aliyun.com/pypi/simple/
https://pypi.mirrors.ustc.edu.cn/simple/
http://pypi.hustunique.com/
http://pypi.sdutlinux.org/
http://pypi.douban.com/simple/

1.2 安装wheel

pip install wheel -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 安装twine

pip install twine -i https://pypi.tuna.tsinghua.edu.cn/simple

1.4 注册PyPI账号

去此网址注册一个即可

2.编写setup.py

2.1 项目文件树

  • 你的项目可能是这样的...
xu736946693@ubuntu:~/Desktop/python-template$ tree
.
├── bin
│   └── start.py
├── conf
│   └── yourfile.conf
├── dataBase
│   └── yourDB
├── docs
│   └── introduction.md
├── lib
│   └── yourlib.py
├── LICENSE
├── log
│   └── version.md
├── package_name
│   ├── __init__.py
│   └── module1
│       └── __init__.py
├── README.md
├── res
│   ├── READMEimgRes
│   │   ├── 7ac23192b1904eb790272d8462cec5b8.png
│   │   └── d919d615def3466f9ff73488c4e62aac.png
│   └── yourResource
│       └── resourceFile
├── settings.zip
├── setup.py
└── tests└── test.py12 directories, 16 files

2.2 编写setup.py文件

setup.py文件是用来打包和上传你的包的重要文件,它有固定的编写范式。下面我将给出我的demo并附上详细注释。

from setuptools import setup, find_packages
from os import paththis_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f:my_long_description = f.read()setup(# 关于classifiers的描述详见如下# https://pypi.org/search/?q=&o=&c=Topic+%3A%3A+Software+Development+%3A%3A+Build+Toolsclassifiers=[# 属于什么类型"Topic :: Software Development :: Libraries :: Python Modules",# 发展时期,常见的如下# Development Status:: 1 - Planning# Development Status:: 2 - Pre - Alpha# Development Status:: 3 - Alpha# Development Status:: 4 - Beta# Development Status:: 5 - Production / Stable# Development Status:: 6 - Mature# Development Status:: 7 - Inactive"Development Status :: 4 - Beta",# 许可证信息"License :: OSI Approved :: MIT License",# 目标编程语言# Programming Language :: C# Programming Language :: C++# Programming Language :: Python :: 3.4# Programming Language :: Python :: 3.5# Programming Language :: Python :: 3.6# Programming Language :: Python :: 3.7# Programming Language :: Python :: 3.8# Programming Language :: Python :: 3.9"Programming Language :: Python :: 3","Programming Language :: Python :: 3.3","Programming Language :: Python :: 3.4","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9",# 运行的操作系统# "Operating System :: POSIX :: Linux","Operating System :: Microsoft :: Windows",# 运行的环境# "Environment :: GPU :: NVIDIA CUDA :: 12",# 开发的目标用户# Intended Audience :: Customer Service# Intended Audience :: Developers# Intended Audience :: Education# ...# Intended Audience :: End Users/Desktop# Intended Audience :: Financial and Insurance Industry# Intended Audience :: Healthcare Industry"Intended Audience :: End Users/Desktop",# 自然语言"Natural Language :: English","Natural Language :: Chinese (Simplified)",],# 如果上传时出现ERROR:The user '' isn't allowed to upload to project '',换个名字,长一点无所谓,不能跟别人重复name="projectTemplate",version="1.0.0",author="Han Xu",author_email="736946693@qq.com",description="This is a project template.",long_description=my_long_description,# 存放源码的地址,填入gitee的源码网址即可# url="https://gitee.com/UnderTurrets/",packages=find_packages(),# README.md文本的格式,如果希望使用markdown语言就需要下面这句话long_description_content_type="text/markdown",# 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等# data_files=[#      ("", ["conf/*.conf"]),#      ("/usr/lib/systemd/system", ["bin/*.service"]),#            ],# 希望被打包的文件# package_data={#     "":["*.txt"],#     "bandwidth_reporter":["*.txt"]#            },# 不打包某些文件# exclude_package_data={#     "bandwidth_reporter":["*.txt"]#            },# 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装# install_requires=["requests",],# setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置# 这里列出的包,不会自动安装。# setup_requires=["",],# 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。# 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。# tests_require=[#     "",# ],# install_requires 在安装模块时会自动安装依赖包# 而 extras_require 不会,这里仅表示该模块会依赖这些包# 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装# extras_require={#     "":  [""],# },
)
  • 根据自己的需要更改即可

3.构建

  • 在项目空间下执行如下指令:
python setup.py sdist bdist_wheel
  • 可以看到项目下会自动生成build目录和lib目录等:
xu736946693@ubuntu:~/Desktop/python-template$ tree -L 3
.
├── bin
│   └── start.py
├── build
│   ├── bdist.linux-x86_64
│   └── lib
│       └── package_name
├── conf
│   └── yourfile.conf
├── dataBase
│   └── yourDB
├── dist
│   ├── projectTemplate-1.0.0-py3-none-any.whl
│   └── projectTemplate-1.0.0.tar.gz
├── docs
│   └── introduction.md
├── lib
│   └── yourlib.py
├── LICENSE
├── log
│   └── version.md
├── package_name
│   ├── __init__.py
│   └── module1
│       └── __init__.py
├── projectTemplate.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── README.md
├── res
│   ├── READMEimgRes
│   │   ├── 7ac23192b1904eb790272d8462cec5b8.png
│   │   └── d919d615def3466f9ff73488c4e62aac.png
│   └── yourResource
│       └── resourceFile
├── settings.zip
├── setup.py
└── tests└── test.py

4.上传

  • 在项目空间下执行如下指令:
twine upload -u <the usrname of your PyPI account> -p <the password of your PyPI account> dist/<the files you want to upload> 
  • 如果你更新了代码,记得更新setup.py中的版本号,重新构建你的代码,再次上传就好了。

ERROR:The user 'XXX' isn't allowed to upload to project ''

  • 你的软件包名字是PyPI用以区分的唯一标识,因此必须全球唯一

如果上传时出现ERROR:The user 'XXX' isn't allowed to upload to project '',换个名字,长一点无所谓,不能跟别人重复。

2024.1.19更新:

目前PyPI官方强制要求两步验证,同时关闭了在终端中输入账密上传包的方式。目前需要在账户中设置API才可以上传。

  1. 设置API

在这里插入图片描述

  1. 在家目录建立.pypirc文件。对于windows用户,即'C:\Users\<Your name>\.pypirc。对于Linux用户,即'~\.pypirc
  2. twine上传
twine upload dist/*

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786534.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 互斥锁 Mutex 源码分析(二)

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 在 Go 互斥锁 Mutex 源码分析(一) 一文中分析了互斥锁的结构和基本的抢占互斥锁的场景。在学习锁的过程中,看的不少文章是基于锁的状态解释的,个人经验来看,从锁的状态出发容易陷入细节,了解锁的状态转换过一段时间就忘…

REST framework:分页

REST framework提供了分页的支持 一、全局配置(不建议使用) 在配置文件中设置全局的分页方式:REST_FRAMEWORK = {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.PageNumberPagination,PAGE_SIZE: 10 # 每页数据量 }二、局部配置 在不同的视图中可以通过pagination_c…

052、Vue3+TypeScript基础,页面通讯之一个组件中多个v-model数据绑定

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

React 和 Vite 环境下 TailwindCSS 的配置指南

1. 安装tailwindcss npm install -D tailwindcss postcss autoprefixer2. 生成tailwindcss 配置文件 npx tailwind init -p3. tailwind.config.js 配置 /** @type {import(tailwindcss).Config} */ export default {content: ["./index.html","./src/**/*.{js,t…

051、Vue3+TypeScript基础,页面通讯之v-model在组件中手写实现

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

docker 修改容器内容后更新镜像的流程

在 Docker 中,如果你修改了一个容器的内容并希望将这些更改保存为一个新的镜像,可以按照以下步骤进行: docker version: 26.1 1. 确保容器运行 首先,确保你正在修改的容器是运行中的。如果容器已经停止,你需要启动它: docker start <container_id> 2. 进入容器并进…

REST framework:排序过滤器的使用

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序 1、在setting中的REST_FRAMEWORK添加配置DEFAULT_FILTER_BACKENDS: (# 这个是指定使用django_filters中的过滤器来进行过滤django_filters.rest_framework.DjangoFilterBac…

AP5160 电压2.5-100V 电流12A PWM 调光 大功率LED驱动 手电筒与摩托车照明方案

产品描述 AP5160 是一款效率高,稳定可靠的 LED 灯恒流驱动控制芯片,内置高精度比较器,固定 关断时间控制电路,恒流驱动电路等,特别适合大功率 LED 恒流驱动。 AP5160采用SOT23-6封装,通过调节外置电流检测的电阻值来设置流过LED 灯的电流,从而设置LED灯的亮度,外驱 MOS…

解决方案 | VS2022 社区版 获取工具和功能找不到visual stdio安装程序的终极解决办法

首先这是一种解决方法: https://blog.csdn.net/Wysnbb/article/details/124588395其次,如果上面方法解决不了,那么可以重新下载vs 社区版。(不要误会,并不是下载10G+的东西) https://visualstudio.microsoft.com/zh-hans/vs/community/下载得到:安装VisualStudioSetup.e…

折腾 Quickwit,Rust 编写的分布式搜索引擎(专为从对象存储中实现亚秒级搜索而设计)

什么是 Quickwit? Quickwit 是首个能在云端存储上直接执行复杂的搜索与分析查询的引擎,并且具有亚秒级延迟。它借助 Rust 语言和分离计算与存储的架构设计,旨在实现资源高效利用、易于操作以及能够扩展到 PB 级数据量。 Quickwit 非常适合日志管理、分布式追踪以及通常为不可…

代码随想录day39 || 198 打家劫舍,213 打家劫舍||,337 打家劫舍|||

198 打家劫舍 func rob(nums []int) int {// 思路,动态规划// dp[i] 代表前下标为i能装的最大盗窃物品价值// 递推 dp[i] = max(dp[i-1], dp[i-2]+v(i)) // dp[i-1] 代表不偷物品i, dp[i-2]+v(i) 代表偷物品i,那么就不能偷i-1,因为题目要求不能相邻,所以考虑前i-2// dp[0]…