egg包是目前最流行的python应用打包部署方式。如何制作和安装egg包?下面我就简单的分析了一下。

总是安装别人的egg包,是不是也想制作自己的egg包呢?好,接下来我们就自己制作一个简单的egg包。

首先建立工程目录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

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

$ ls -F
build/ dist/ setup.py UNKNOWN.egg-info/

可以看到多了三个文件夹。而在dist文件夹下,有一个egg文件:UNKNOWN-0.0.0-py2.6.egg。

产蛋成功!先看看这个egg文件是什么格式的:

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

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

$ unzip -l dist/UNKNOWN-0.0.0-py2.6.egg
Archive: dist/KNOWN-0.0.0-py2.6.egg
Length Date Time Name
--------- ---------- ----- ----
120 2010-12-06 17:04 EGG-INFO/SOURCES.txt
1 2010-12-06 17:04 EGG-INFO/top_level.txt
1 2010-12-06 17:04 EGG-INFO/zip-safe
1 2010-12-06 17:04 EGG-INFO/dependency_links.txt
227 2010-12-06 17:04 EGG-INFO/PKG-INFO
--------- -------
350 5 files

只有一个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-py2.6.egg
Archive: dist/demo-0.1.0-py2.6.egg
Length Date Time Name
--------- ---------- ----- ----
121 2010-12-06 17:30 demo/__init__.py
344 2010-12-06 17:46 demo/__init__.pyc
137 2010-12-06 17:46 EGG-INFO/SOURCES.txt
5 2010-12-06 17:46 EGG-INFO/top_level.txt
1 2010-12-06 17:46 EGG-INFO/zip-safe
1 2010-12-06 17:46 EGG-INFO/dependency_links.txt
227 2010-12-06 17:46 EGG-INFO/PKG-INFO
--------- -------
836 7 files

可以看到,多了一个文件夹demo,里面有我们写的__init__.py。

奉行敏捷原则,先安装了体验一下再说:

$ sudo python setup.py install
running install
install_dir /usr/local/lib/python2.6/dist-packages/
...
creating /usr/local/lib/python2.6/dist-packages/demo-0.1.0-py2.6.egg
Extracting demo-0.1.0-py2.6.egg to /usr/local/lib/python2.6/dist-packages
demo 0.1.0 is already the active version in easy-install.pth Installed /usr/local/lib/python2.6/dist-packages/demo-0.1.0-py2.6.egg
Processing dependencies for demo==0.1.0
Finished processing dependencies for demo==0.1.0

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目录下找包,而不是原来默认的工程根目录。

最后我们来手动的卸载以下刚才安装的egg文件,以python2.6版本为例,egg文件一般安装在/usr/local/lib/python2.6/dist-packages/目录下,该目录下还有一个easy-install.pth文件,用于存放安装的egg信息。:

$ cd /usr/local/lib/python2.6/dist-packages
$ cat easy-install.pth|grep demo
./demo-0.1.0-py2.6.egg
$ ls -F|grep demo
demo-0.1.0-py2.6.egg/

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

参考:

http://pypi.python.org/pypi/setuptools

http://blog.ossxp.com/2010/12/2178/#id8

心得:

打包时,注意如下文档结构:

setup.py中内容如下:

from setuptools import setup,find_packages
setup(
name = 'srcDetect',
version = '0.1.0',
packages=find_packages(), license = 'GPL',
keywords = 'test api mydemo',
platforms = "Independant",
url = '',
)

name只是代表你打包完成后egg包的名子,导入的时候还是要用文件夹的名字。

python的egg的制作的更多相关文章

  1. python的egg包的安装和制作]

    Defining Python Source Code Encodings Python egg 的安装 egg文件制作与安装 2011-06-10 14:22:50|  分类: python |   ...

  2. Python 二维码制作

    Python 二维码制作 先介绍python 二维码制作的第三方库 QRCode .MyQR QRCode    生成这个二维码只用三行 import qrcode img = qrcode.make ...

  3. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  4. 使用Python的selenium库制作脚本,支持后台运行

    本文介绍如何使用Python的selenium库制作脚本.概念:       Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome.Firefox.Safari等主流界面 ...

  5. Python的egg包

    1.背景 查看flower的源码,首先看到flower的主程序如下: #!/usr/local/sinasrv2/bin/python2.7 # EASY-INSTALL-ENTRY-SCRIPT: ...

  6. (转)python 模块安装包 制作

    转自: http://testerhome.com/topics/539 用过python的同学对于python setup.py install肯定不会陌生.那么我们自己如果封装了很多的方法怎么很好 ...

  7. (数据科学学习手札85)Python+Kepler.gl轻松制作酷炫路径动画

    本文示例代码.数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl相信很多人都听说过,作为 ...

  8. python使用pysimplegui简单制作一个exe程序

    一.安装打包程序 控制台输入: pip install pysimplegui-exemaker -- 安装exe制作库 pip install PySimpleGUI -- 安装图形化界面编辑库 二 ...

  9. Python爬虫之Scrapy制作爬虫

    前几天我有用过Scrapy架构编写了一篇爬虫的代码案例深受各位朋友们喜欢,今天趁着热乎在上一篇有关Scrapy制作的爬虫代码,相信有些基础的程序员应该能看的懂,很简单,废话不多说一起来看看. 前期准备 ...

  10. python词云的制作方法

    第一次接触到词云主要是觉得很好看,就研究了一下,官方给出了代码的,但是新手看的话还是有点不容易,我们来尝试下吧. 环境:python2.7 python库:PIL(pillow),numpy,matp ...

随机推荐

  1. JSP中的JSTL 标签库

    目录 JSTL 标签库 JSTL 标签库的使用步骤 core 核心库使用 <c:set /> (使用很少) <c:if /> <c:choose><c:whe ...

  2. Dash 2.18版本新特性介绍

    本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffer ...

  3. Encoder-Decoder、Seq2Seq、Attention

    Encoder-Decoder.Seq2Seq.Attention 传送门1:Encoder-Decoder 和 Seq2Seq 因为注意力不集中,所以这篇随笔就是看别人的文章,随手参考写写的. 1. ...

  4. 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引

    在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,在第37条中建议 用EnumMap替换序数索引,为什么? EnumSet 在EffectiveJava中的第 36条中 ...

  5. DOM – Work with Document.styleSheets and JS/Scss Breakpoint Media Query

    前言 为了方便管理, 我们会定义 CSS Variables, 类似于全局变量. 有时候做特效的时候还需要 JavaScript 配合, 这时就会希望 JavaScript 可以获取到 CSC Var ...

  6. Spring —— 注解开发(依赖注入)

    自动装配   引用类型         简单类型      加载properties文件      

  7. MVC模式与三层架构

    MVC 模式    三层架构    MVC 模式 与 三层架构 的关系   

  8. SpringBoot 集成 LDAP

    LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...

  9. 无人值守的IDC机房动环综合运维方案

    ​ 企业数字化转型以及5G.物联网.云计算.人工智能等新业态带动了数据中心的发展,在国家一体化大数据中心及"东数西算"节点布局的推动下,数据中心机房已成为各大企事业单位维持业务正常 ...

  10. 立足信创国产化运维,打造安全可控IT运维管理系统

    随着国产化信创应用试点行业的不断扩大,应用信创产品的企事业单位逐渐增多.大多数企业均面临着陌生的国产化环境与产品,其使用习惯和解决问题的方式都面临改变.北京智和信通切实立足用户需求,提供信创运维服务. ...