python打包成安装包_把 python 程序打包成 egg 或者 whl 安装包

1.1 安装setuptools

首先要安装setuptools工具。Debian/Ubuntu下可以直接使用apt安装:

$ sudo apt-get install python-setuptools

或者通过pip安装:

$ pip install setuptools

更新setuptools:

$ pip install --upgrade setuptools

或者下载setuptools的whl包来安装。可以在这里查看最新版本下载。下载完毕以后通过sh安装。

$ wget https://files.pythonhosted.org/packages/ec/51/f45cea425fd5cb0b0380f5b0f048ebc1da5b417e48d304838c02d6288a1e/setuptools-41.0.1-py2.py3-none-any.whl

$ pip install setuptools-41.0.1-py2.py3-none-any.whl

现在就可以使用pip命令来安装其他的 egg 或者 whl 包了。

1.2 制作自己的egg包

总是安装别人的 egg/whl 包,是不是也想制作自己的包呢?好,接下来我们就自己制作一个简单的包。 首先建立工程目录egg-demo,初始化一个 setup.py 文件:

$ mkdir egg-demo

$ cd egg-demo

$ touch setup.py

$ ls

setup.py

下面主要就是填充 setup.py。setup.py 其实是 python 工具包distutils的配置文件,setuptools就是基于distutils来做的。 在 setup.py 中通过setup函数来配置打包信息。首先要引入setuptools的函数setup。setuptools的setup其实就是distutils的setup函数,填写 setup.py 为以下内容:

$ cat setup.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

from setuptools import setup

setup()

写到这里,一个空的 egg 配置文件就写好了。我们可以使用下面命令生成 egg 包:

$ python setup.py bdist_egg

或者生成 whl 包:

$ python setup.py bdist_wheel

下面看看究竟生成了什么:

$ ls -F

build/ dist/ setup.py UNKNOWN.egg-info/

可以看到多了三个文件夹。而在 dist 文件夹下,有一个 egg 文件:UNKNOWN-0.0.0-py3.6.egg。 产蛋成功!先看看这个 egg 文件是什么格式的:

$ file dist/UNKNOWN-0.0.0-py3.6.egg

dist/UNKNOWN-0.0.0-py3.6.egg: Zip archive data, at least v2.0 to extract

噢,原来就是一个zip压缩包呀!好,再来看看内部构造:

$ unzip -l dist/UNKNOWN-0.0.0-py3.6.egg

Archive: dist/UNKNOWN-0.0.0-py3.6.egg

Length Date Time Name

--------- ---------- ----- ----

181 2019-07-16 14:43 EGG-INFO/PKG-INFO

132 2019-07-16 14:43 EGG-INFO/SOURCES.txt

1 2019-07-16 14:43 EGG-INFO/dependency_links.txt

1 2019-07-16 14:43 EGG-INFO/top_level.txt

1 2019-07-16 14:43 EGG-INFO/zip-safe

--------- -------

316 5 files

同样的,可以对 whl 文件进行查看:

$ file dist/UNKNOWN-0.0.0-py3-none-any.whl

dist/UNKNOWN-0.0.0-py3-none-any.whl: Zip archive data, at least v2.0 to extract

$ unzip -l dist/UNKNOWN-0.0.0-py3-none-any.whl

Archive: dist/UNKNOWN-0.0.0-py3-none-any.whl

Length Date Time Name

--------- ---------- ----- ----

171 2019-07-16 06:44 UNKNOWN-0.0.0.dist-info/METADATA

97 2019-07-16 06:44 UNKNOWN-0.0.0.dist-info/WHEEL

1 2019-07-16 06:44 UNKNOWN-0.0.0.dist-info/top_level.txt

296 2019-07-16 06:44 UNKNOWN-0.0.0.dist-info/RECORD

--------- -------

565 4 files

可以看到,whl 文件和 egg 文件还是有不同的。

只有一个EGG-INFO文件夹,内含五个 egg 信息文件,没了。 这个 egg 名称未知,版本 0.0.0。这是因为我们在setup里什么也没有设置。 显然,这个 egg 什么也不能做。 下面给它加点料。 在setup.py中,setup函数接收一系列属性作为配置参数。

name:name 是 egg 包的名称,也是寻找要打包的文件夹的名称,默认是 UNKNOWN。

version:版本号,默认 0.0.0

packages:这里要用到 setuptools 的另一个函数 find_packages,顾名思义,find_packages 用来将指定目录下的文件打包。

zip_safe:默认是 False,这样在每次生成 egg 包时都会检查项目文件的内容,确保无误。

还有一些描述性的属性,如 description,long_description,author,author_email,license,keywords,platform,url 等。 填充setup.py文件如下::

$ cat setup.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

from setuptools import setup, find_packages

setup(

name = "demo",

version="0.1.0",

packages = find_packages(),

zip_safe = False,

description = "egg test demo.",

long_description = "egg test demo, haha.",

author = "amoblin",

author_email = "amoblin@ossxp.com",

license = "GPL",

keywords = ("test", "egg"),

platforms = "Independant",

url = "",

)

在egg-demo目录下建立和上述 name 名称相同的目录demo,demo目录下写__init__.py文件:

$ mkdir demo

$ cat demo/__init__.py

#!/usr/bin/env python

#-*- coding:utf-8 -*-

def test():

print "Hello, I'm amoblin."

if __name__ == '__main__':

test()

再次生成 egg 包以后查看 egg 包信息:

$ python setup.py bdist_egg

$ unzip -l dist/demo-0.1.0-py3.6.egg

Archive: dist/demo-0.1.0-py3.6.egg

Length Date Time Name

--------- ---------- ----- ----

227 2019-07-16 14:50 EGG-INFO/PKG-INFO

164 2019-07-16 14:50 EGG-INFO/SOURCES.txt

1 2019-07-16 14:50 EGG-INFO/dependency_links.txt

1 2019-07-16 14:50 EGG-INFO/not-zip-safe

5 2019-07-16 14:50 EGG-INFO/top_level.txt

111 2019-07-16 14:49 demo/__init__.py

--------- -------

509 6 files

可以看到,多了一个文件夹demo,里面有我们写的__init__.py。 奉行敏捷原则,先安装了体验一下再说:

$ sudo python setup.py install

running install

running bdist_egg

running egg_info

writing demo.egg-info/PKG-INFO

writing dependency_links to demo.egg-info/dependency_links.txt

writing top-level names to demo.egg-info/top_level.txt

reading manifest file 'demo.egg-info/SOURCES.txt'

writing manifest file 'demo.egg-info/SOURCES.txt'

installing library code to build/bdist.linux-x86_64/egg

running install_lib

running build_py

creating build/bdist.linux-x86_64/egg

creating build/bdist.linux-x86_64/egg/demo

copying build/lib/demo/__init__.py -> build/bdist.linux-x86_64/egg/demo

byte-compiling build/bdist.linux-x86_64/egg/demo/__init__.py to __init__.cpython-36.pyc

creating build/bdist.linux-x86_64/egg/EGG-INFO

copying demo.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO

copying demo.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO

copying demo.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO

copying demo.egg-info/not-zip-safe -> build/bdist.linux-x86_64/egg/EGG-INFO

copying demo.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO

creating 'dist/demo-0.1.0-py3.6.egg' and adding 'build/bdist.linux-x86_64/egg' to it

removing 'build/bdist.linux-x86_64/egg' (and everything under it)

Processing demo-0.1.0-py3.6.egg

removing '/usr/local/lib/python3.6/dist-packages/demo-0.1.0-py3.6.egg' (and everything under it)

creating /usr/local/lib/python3.6/dist-packages/demo-0.1.0-py3.6.egg

Extracting demo-0.1.0-py3.6.egg to /usr/local/lib/python3.6/dist-packages

demo 0.1.0 is already the active version in easy-install.pth

Installed /usr/local/lib/python3.6/dist-packages/demo-0.1.0-py3.6.egg

Processing dependencies for demo==0.1.0

Finished processing dependencies for demo==0.1.0

在这一步,也可以直接进入到 dist 文件夹中,使用 pip install demo-0.1.0-py3.6.egg 命令来安装。还更加方便,因为在卸载的时候也可以使用 pip remove 命令来卸载

OK!安装完毕!接下来我们就可以直接通过import来使用啦!

$ python -c "from demo import test;test()"

Hello, I'm amoblin.

成功输出!这说明安装正确。我们的一个 egg 包诞生了。 一般情况下,我们的源程序都放在 src 目录下,所以接下来将 demo 文件夹移动到 src 里。但这样也要修改setup.py文件,修改find_packages函数中参数为'src',同时增加package_dir参数:

packages=find_packages('src'),

package_dir = {'':'src'}

这样告诉 setuptools 在 src 目录下找包,而不是原来默认的工程根目录。

1.3 egg 文件卸载

以 python3.6 版本为例,egg 文件一般安装在/usr/local/lib/python3.6/dist-packages/目录下,该目录下还有一个easy-install.pth文件,用于存放安装的 egg 信息:

$ cd /usr/local/lib/python3.6/dist-packages

$ cat easy-install.pth|grep demo

./demo-0.1.0-py3.6.egg

$ ls -F|grep demo

demo-0.1.0-py3.6.egg/

卸载 egg 文件很简单,首先将包含此 egg 的行从 easy-install.pth 中删除,然后删除 egg 文件夹即可。

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

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

相关文章

关于C#事件处理函数中的参数(object sender, EventArgs e)

1、是事件源,表示触发事件的那个组件 如(button/label/listview...),比如说你单击button,那么sender就是button2、EventArgs是事件参数,它用来辅助你处理事件比如说你用鼠标点击窗体,那么EventArgs是会包含点击的位置…

spss22.0统计分析从入门到精通_数据分析最全资料:SPSS/MATLAB/SQL/SAS/EXCEL经典教材+视频教程,快速入门!...

可以说当今社会数据就是力量。数据分析能力已经成为各个行业必备的技能,如果能熟练掌握数据分析技能,不管是留学申请还是以后的就业,都会是一个很大的加分项。但是目前国内很少有高校专门开设数据分析课程,想要掌握技能大部分要靠…

可反复擦写5万次的手写板,竟然还能用橡皮擦能清除屏幕!

作为一名文艺青年,平时写字画画是我的一大爱好。 心情不错,来个创作! 还记得我们之前介绍过的Boogie Board电子手写板吗? 小木用的就是它。 虽然好用,只不过有时候不小心画错了,只能重新来。 伤心啊…… 不…

普通用户杜绝不请自来的邮件对策

1、给自己的信箱起个“复杂用户名”:许多人习惯用自己姓名的拼音作为用户名,但一般过于简单,这样被垃圾邮件制造者捕捉到的机率很高。因此在申请邮箱时,不妨起个保护性强一点的用户名,比如英文和数字的组合,尽量长一点…

[Abp 源码分析]权限验证

点击上方蓝字关注我们0.简介Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证。在 Abp 框架内部,权限分为两块,一个是功能(Feature),一个是权限项(Permissio…

cocoscreator editbox 只允许数字_《Cocos Creator游戏实战》做一个数字调节框

当玩家购买道具的时候,一个个买可能会比较麻烦,用数字调节框的话玩家一次性就可以买好几十个了(钱够的话)。运行效果如下:Cocos Creator版本:2.2.0公号"All Codes"后台回复"数字调节框",获取该项目…

linux自动应答,08. 创建 ks.cfg自动应答文件

Kiskstart 安装步骤比较 Cobbler 自动化部署复杂些,众所周知,随着时间推移,行业会逐步的降低软件操作难度以作为软件提升的标志,于是 Cobbler 产生掩盖或者帮操作者完成了许多工作,于是使用就更简单。但是使用 Kisksta…

python类变量共享吗_第7.12节 可共享的Python类变量

第7.12节 可共享的Python类变量一、 引言在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有…

为什么一流成功人士的闹钟都定在早晨5:57?

对很多人来说,早晨时分是一天中最匆忙的时段。近年来,我在研究人们如何利用时间的过程中发现,市场上铺天盖地的媒体教你如何利用早晨的时间。 美国国家睡眠基金会发布的一项睡眠调查结果显示,在工作日的早晨,30-50岁的…

命令行小技巧

我们平时使用Linux的时候经常遇到这样一个问题,举例有这样一种情况:执行命令 $ cp /etc/apt/sources.list /etc/apt/sources.list.bak 这里面有个问题,明明 /etc/apt/sources 这几个字都是一样的,为什么要打两遍?这样的…

统计学习导论_统计机器学习之扫盲导论篇

机器学习之扫盲导论篇来都来了,不关注一下吗??人工智能是当下最火的词,而机器学习就是它的灵魂。现在超级多搞金融的人已经用到很深的机器学习模型了,更别提互联网企业的大佬们了,比如:(这是一篇…

linux环境下创建postgis数据库,linux下搭建postgresql、postgis、pg_pathman环境步骤详解...

操作系统:centOS6.6安装postgreSQL9.6.2安装命令:./postgresql-9.6.3-2-linux-x64.run之后按照图形界面操作安装,语言选择zh_CN UTF-8安装geos-3.6.0(会报错,暂时不用管)安装命令:tar xjvfgeos-3.6.0.tar.bz2cd geos-3…

[Abp 源码分析]异常处理

点击上方蓝字关注我们Abp 框架本身针对内部抛出异常进行了统一拦截,并且针对不同的异常也会采取不同的处理策略。在 Abp 当中主要提供了以下几种异常类型:异常类型描述AbpExceptionAbp 框架定义的基本异常类型,Abp 所有内部定义的异常类型都继…

phpstorm设置 打开文件所在目录_PDF文件在线分享并设置打开次数

公司有一些重要的PDF文档,怎么才能防止外泄?如何加密PDF文件防止被人复制了?怎样让PDF不能被别人拷贝啊? 这些问题困扰了一部分想让别人看pdf内容又担心别人泄露的人。本文用maipdf网站的例子来进行设置。首先我们打开maipdf的网站…

荐号 | 11个人工智能与大数据相关的个人、企业优质号

AlphaGo Zero都会自学了,作为刚刚步入AI大门的我们,应该如何选择合适自己的知识平台呢?今天小编为你甄选了几个高质量的技术公众号。 这些号更多的不是讲授枯燥的理论,而是从行业资讯、一线技术、应用案例、职场发展等多个角度分享…

以表达式作为参数传入SQL的存储过程中去

在开发过程中,需要把一句Sql 的expression作为一个参数传入Procedure中去。 在asp.net中,一个Search的动作,把用户所操作的搜索条件写成了一句表达式,现只需要把这句表达式传入存储过程中去,与存储过程中的Sql的Select…

围棋中的数学原理

围棋一向被誉为是人类大脑智慧的专利,围棋的走法,几乎和宇宙中原子数量相同,甚至更多,每回合有250种可能,一盘棋可以长达150个回合,共有1后面再加360个0种下法,这样的计算量,对计算机…

spring boot 缓存_Spring Boot 集成 Redis 实现数据缓存

Spring Boot 集成 Redis 实现数据缓存,只要添加一些注解方法,就可以动态的去操作缓存了,减少代码的操作。在这个例子中我使用的是 Redis,其实缓存类型还有很多,例如 Ecache、Mamercache、Caffeine 等。Redis 简介Redi…

.md是什么文件_Element-UI源码阅读之md显示到页面

入口文件首先,看一个项目的入口,可以从package.json中去看它的运行命令 可以看到dev那行,执行了很多脚本: npm run bootstrap && npm run build:file && cross-env NODE_ENVdevelopment webpack-dev-server --con…

linux误删ssh不上,误删openssh-server删除,复原操作

在别的节点上寻找openssh的程序有哪些:而我的这个节点上只有一个openssh-clines,所以,就先利用了yum install openssh-server进行安装,但是这个安装的是最新的 openssh-server-5.3p1-122.el6.x86_64.rpm,担心集群节点之…