python打包库_Python 打包自己的库到 PYPI (可pip安装)

背景

在我们安装 Python 库的时候,通常我们都是pip install xxx

真是又酷炫又方便

那么,当我们自己写了一些自认为不错的库,想要分享给大家使用(或者是想要装X时)能不能也能做到这样呢?

环境需求已经写好能正常使用的库/方法/项目 (可本地调用)

步骤创建一个这样的目录结构,我们接下来的命令都在 example_pkg/__init__.py 目录进行

/packaging_tutorial

/example_pkg

__init__.py

2. 编辑 example_pkg/__init__.py ,写入以下内容

name = "example_pkg"

3. 创建 packaging_tutorial/setup.py

setup.py 是 setuptools 的构建脚本,用于告知 setuptools 我们要上传到PYPI的库的信息(库名、版本信息、描述、环境需求等)

下面是 setup.py 的示例

import setuptools

with open("README.md", "r") as fh:

long_description = fh.read()

setuptools.setup(

name="example-pkg-your-username",

version="0.0.1",

author="Example Author",

author_email="author@example.com",

description="A small example package",

long_description=long_description,

long_description_content_type="text/markdown",

url="https://github.com/pypa/sampleproject",

packages=setuptools.find_packages(),

classifiers=[

"Programming Language :: Python :: 3",

"License :: OSI Approved :: MIT License",

"Operating System :: OS Independent",

],

)

参数解析name:库名

version:版本号

author:作者

author_email:作者邮箱(如:别人发现了bug或者提建议给我们添加功能联系我们用的)

description:简述

long_description:详细描述(一般会写在README.md中)

long_description_content_type:README.md中描述的语法(一般为markdown)

url:库/项目主页,一般我们把项目托管在GitHub,放该项目的GitHub地址即可

packages:使用setuptools.find_packages()即可,这个是方便以后我们给库拓展新功能的(详情请看官方文档)

classifiers:指定该库依赖的Python版本、license、操作系统之类的

4. 创建 packaging_tutorial/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.

5. 创建 packaging_tutorial/LICENSE ,对于每一个创建的库来说 LICENSE 是很重要的,这告诉大 家我们的库能用在什么方面(商用?之类的)还有免责啊之类的;一般来说我们选择MIT

MIT License

Copyright (c) [year] [fullname]

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.

MIT LICENSE 的大概意思是软件可以随便用,随便改

可以免费,可以收费

软件的源文件里必须有这个许可证文档

我提供这个软件不是为了犯法,你要用它来犯法,那与我无关

你用这个软件犯事了,责任全在你自己,与其他贡献者无关

关于 setup.py 和 和 的写法,大家可以参照我先前写的 maida 库,地址我会放在文末。

选择自己的 LICENSE 可以点击下方链接

6. 确保我们已安装最新setuptools 和 wheel和twine ,下面是安装/更新命令

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

7. 打包的我们的库/项目

python3 setup.py sdist bdist_wheel

此时在当前目录我们会看到以下:

dist/

example_pkg_your_username-0.0.1-py3-none-any.whl

example_pkg_your_username-0.0.1.tar.gz

8. 使用 twine 将打包好的库/项目上传到PYPI

(需用到PYPI帐号密码)(此时只是上传到PYPI测试服,还不能 pip install 这个库/项目)

python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

我们会看到如下界面:

Uploading distributions to https://test.pypi.org/legacy/

Enter your username: [your username]

Enter your password:

Uploading example_pkg_your_username-0.0.1-py3-none-any.whl

100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]

Uploading example_pkg_your_username-0.0.1.tar.gz

100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]

上传成功之后,我们可以去PYPI的测试服查看是否上传成功,能上传成功的话就说明肯定也能成功上传到PYPI正式服(附:PYPI测试服地址)

PYPI测试服的管理员会不定期删除上边的库,正式投入使用还是得上传到正式服。

由于我先前有上传库到测试服,我们可以尝试搜索看看

若是想测试下上传到测试服的库能否使用,可以使用如下命令

python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-your-username

大致会出现以下:

Collecting example-pkg-your-username

Downloading https://test-files.pythonhosted.org/packages/.../example-pkg-your-username-0.0.1-py3-none-any.whl

Installing collected packages: example-pkg-your-username

Successfully installed example-pkg-your-username-0.0.1

若是从测试服安装的我们的库能正常使用,那么我们就可以开始行动把它上传到PYPI正式服供大家使用了。(之所以特地提出这一步,是因为第一次上传库时,我们总会因为目录结构不会、未打包成库可正常使用打包了却不能用等等原因导致上传的是个“失败的库”,这样能避免别人会安装到我们的失败库)

简单测试是否能正常使用直接如下即可,但具体里边的功能能否正常用我们还需调用一下,此处不做介绍

>>> import example_pkg

>>> example_pkg.name

'example_pkg'

9. 【重头戏】将库上传到 PYPI正式服

twine upload dist/*

上传成功后该库即可直接pip安装

上传PYPI示例库LZC6244/maida​github.com

如果对目录结构或者其他有什么不清楚的可以参考我这个库(结构较简单适合初学者),或者我们平时使用的库(譬如本人平时经常使用 scrapy 也可以去 scrapy 主页参考大佬的写法)

2019.9.16更新

安装自己库的依赖库

setup(

...

install_requires=[

'你的库依赖的第三方库(也可以指定版本)',

# exapmle

'pyautogui',

'Django >= 1.11, != 1.11.1, <= 2',

],

)

官方文档传送门

原创文章,转载请保留或注明出处!

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

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

相关文章

ASP.NET Core Web API使用静态swagger.json文件

前言ASP.NET Core Web API默认集成了Swashbuckle&#xff0c;可以在运行时显示Swagger UI&#xff1a;而Swagger UI实际上是解析的动态生成的swagger.json&#xff1a;app.UseSwagger(); app.UseSwaggerUI(c > c.SwaggerEndpoint("/swagger/v1/swagger.json", &qu…

XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

问题现象 1. 在使用了UPM与文件夹重定向后&#xff0c;个人的桌面路径就会变成一个UNC路径&#xff0c;这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式&#xff0c;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

Zookeeper-Zookeeper的配置

前面两篇文章介绍了Zookeeper是什么和可以干什么&#xff0c;那么接下来我们就实际的接触一下Zookeeper这个东西&#xff0c;看看具体如何使用&#xff0c;有个大体的感受&#xff0c;后面再描述某些地方的时候也能在大脑中有具体的印象。本文只关注分布式模式的zookeeper&…

Android插件化开发之动态加载基础之ClassLoader工作机制

类加载器ClassLoader 早期使用过Eclipse等Java编写的软件的同学可能比较熟悉&#xff0c;Eclipse可以加载许多第三方的插件&#xff08;或者叫扩展&#xff09;&#xff0c;这就是动态加载。这些插件大多是一些Jar包&#xff0c;而使用插件其实就是动态加载Jar包里的Class进行…

python运行时间过长怎么优化_Python性能优化的20条建议

1.优化算法时间复杂度算法的时间复杂度对程序的执行效率影响最大&#xff0c;在Python中可以通过选择合适的数据结构来优化时间复杂度&#xff0c;如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式&#xff0c;总得来说&#xff0c;一般有分…

周选特辑|一些超棒的开源项目!

编程导航 每周新增资源优选特辑 02编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。美好的一周又过去了&#xff0c;大家有没有认真学习呢&#x…

js字符串函数大全

JS自带函数concat将两个或多个字符的文本组合起来&#xff0c;返回一个新的字符串。var a "hello";var b ",world";var c a.concat(b);alert(c);//c "hello,world"indexOf返回字符串中一个子串第一处出现的索引&#xff08;从左到右搜索&…

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一、温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉&#xff0c;猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二、介绍 我们知道在Android中可以跟java一样实现动态加载jar&…

js监听多个事件_JavaScript中的事件与异常捕获解析

这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;写的十分的全面细致&#xff0c;具有一定的参考价值&#xff0c;对此有需要的朋友可以参考学习下。如有不足之处&#xff0c;欢迎批评指正。事件处理…

GDUFE ACM-1045

题目&#xff1a;http://acm.gdufe.edu.cn/Problem/read/id/1045 Elevator Time Limit: 2000/1000ms (Java/Others) Problem Description: The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote a…

mongodb的IO测试工具 mongoperf

之前没发现mongoperf这个工具&#xff0c;测试IO的状态用的是iostat来进行观察。 mongoperf < myjsonconfigfile echo "{nThreads:2,fileSizeMB:20,w:true,r:true}" | mongoperf参数示列如下&#xff1a; {nThreads:<n>, fileSizeMB:<n>, sleepMicros…

C#多线程开发-使用并发集合

前言大家好&#xff0c;我是阿辉。在C#语言中当需要处理并发的场景时&#xff0c;就需要程序员使用最合理的数据结构。那么哪些数据结构是支持和可以在并行计算中被使用的呢。首先这些数据结构具备可伸缩性&#xff0c;尽可能地避免锁(会造成多个线程的等待&#xff0c;防止资源…

Android之用sharedUserId来实现不同应用(APK)数据共享

android:sharedUserId 当APK安装的时候&#xff0c;userid这个标志就会产生。APK在设备上的整个生命周期中&#xff0c;这个ID不再改变。不同设备上同一个应用包可能有不同的userid&#xff0c;重要的是在给定的设备上&#xff0c;每个应用包有自己独立的userid。 userid的特点…

windows 下安装wamp环境

一直以来都是学习在Linux下安装lanmp环境&#xff0c;在Windows下都是用的集成工具比如appserv现在来安装Windows版本的lamp都是从官网下载的资源在Windows下以后还会编辑更多的东西。我的文章都会以后都有更新&#xff0c;因为有时候有点想法&#xff0c;如果不实践的话会忘记…

python编程发展_编程的发展史及Python简介

一.编程语言演变史编程语言分为三类&#xff0c;分别是机器语言&#xff0c;汇编语言和高级程序语言。1.机器语言&#xff1a;用0和1表示二进制跟计算机进行直接的沟通交流&#xff0c;对硬件进行直接操作。2.汇编语言&#xff1a;用简单的英文标签来表示二进制数&#xff0c;对…

iOS ShareSDK 使用

流量精灵软件中&#xff0c;也在大部分地方使用到了shareSDK 这个三方开源库。具体的有两种需求 a、弹出所有分享模块 b、只弹出指定的平台&#xff1a;如微信朋友圈和QQ 。 配置方法&#xff0c;三方库中也很详细&#xff0c;这里我只有写出自出自己代码实现的部分 这里只写自…

应用环境下的TIME_WAIT和CLOSE_WAIT

转载自&#xff1a;http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常&#xff0c;具体过程如下&#xff1a;http://blog.csdn.net/shootyou/article/details/6615051里头的分析过程有提到&#xff0c;通过查看服务器网…