Python 常识

很多东西都是用 python 写的 比如 brew octopress gae… 有些东西经常用到, 每次都要查资料 看来有必要记录一些相关的知识.

egg

egg…传说中的蟒蛇蛋,是目前最流行的python应用打包部署方式.

1
2
[haidx@mbp:~/repo/octopress]$ locate *.egg | head -n 1  | xargs -n 1 file
/Users/haidx/goagent-3.1.5/local/dnslib-0.8.3.egg: Zip archive data, at least v2.0 to extract

执行上述命令发现其实就是一个 zip 打包文件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[haidx@mbp:~/repo/octopress]$ unzip -l  /Users/haidx/goagent-3.1.5/local/dnslib-0.8.3.egg
Archive:  /Users/haidx/goagent-3.1.5/local/dnslib-0.8.3.egg
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-22-14 09:07   dnslib/
     1024  10-20-12 01:08   dnslib/bimap.py
     2045  09-13-12 12:51   dnslib/bit.py
     1824  10-20-12 02:24   dnslib/buffer.py
    28011  04-27-13 08:33   dnslib/dns.py
     3953  09-13-12 12:51   dnslib/label.py
        0  01-22-14 09:07   dnslib/server/
     1096  09-13-12 12:51   dnslib/server/circuits_server.py
     1337  10-20-12 01:29   dnslib/server/gevent_server.py
     2263  11-11-12 03:43   dnslib/server/udp_proxy.py
     1389  11-11-12 03:44   dnslib/server/udp_server.py
        0  10-19-12 17:30   dnslib/server/__init__.py
       19  09-13-12 12:51   dnslib/__init__.py
        0  01-22-14 09:07   EGG-INFO/
        1  01-21-14 17:05   EGG-INFO/dependency_links.txt
     6709  01-21-14 17:05   EGG-INFO/PKG-INFO
      386  01-21-14 17:05   EGG-INFO/SOURCES.txt
        7  01-21-14 17:05   EGG-INFO/top_level.txt
        1  01-21-14 17:05   EGG-INFO/zip-safe
 --------                   -------
    50065                   19 files

EGG-INFO 一般有五个信息文件.其他的文件都是更加 setup.py 里的 name 寻找要打包的文件夹的名称 然后用 packages 指定的find_packages 打包

如何移除 egg 包

非常简单 找到easy-install.pth

1
2
3
4
5
6
7
8
9
10
11
[haidx@mbp:~/tmp/pytest/egg-demo]$ locate easy-install.pth
/Library/Python/2.7/site-packages/easy-install.pth
/Library/Python/2.7/site-packages/easy-install.pth.bak
/usr/local/lib/python2.7/site-packages/easy-install.pth

[haidx@mbp:~/tmp/pytest/egg-demo]$ cat /usr/local/lib/python2.7/site-packages/easy-install.pth
import sys; sys.__plen = len(sys.path)
./setuptools-3.6-py2.7.egg
./pip-1.5.5-py2.7.egg
./rdbtools-0.1.6-py2.7.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

首先将包含此egg的行从easy-install.pth中删除,然后删除egg文件夹即可
这里我用的 brew 安装的 所以在 /user/local 下 上面那个 Library 下的是系统自带的 python.

easy_install

当需要安装第三方python包时,可能会用到 easy_install命令它是由 PEAK(Python Enterprise Application Kit) 开发的 setuptools 包里带的一个命令,它用来安装egg包。

如果已经把egg文件下载到了本地,则easy_install xxx.egg就ok了,如果有依赖,则会自动下载安装,省心了。如果没有下载下来,网络安装更爽,直接 easy_install 包名,此时喝点咖啡休息一下,回过神来时已经安装好了。唯一一点不好的感觉是,easy_install现在还不支持自动卸载,网上流传的用 easy_install -m xxx来卸载,是不行了,这个命令式用来安装同一个包的多个版本的。

setuptools 和 easy_install

setuptools:setuptools 是一组由PEAK(Python Enterprise Application Kit)开发的 Python 的 distutils 工具的增强工具,可以让程序员更方便的创建和发布 Python的egg 包,特别是那些对其它包具有依赖性的状况。 由 setuptools 创建和发布的包看起来和基于 distutils 发布的包没什么不同。最终用户不需要事先安装 setuptools 甚至根本不需要知道 setuptools 的存在,而程序员也不需要附上完整的 setuptools,只需要包含一个大小约 8K 的ez_setup.py脚本作为启动模块,就可以在最终用户没有安装适当版本的 setuptools 时让这些包自动下载和安装 setuptools。

easy_install: 常使用python的人员,当需要安装第三方python包时,可能会用到这个. easy_install是由PEAK(Python Enterprise Application Kit)开发的setuptools包里带的一个命令 它用来自动的从 http://pypi.python.org/simple/ 来安装egg包,相当于perl中的cpan或PPM。

so..我们需要先装 setuptools 才有 easy_install

我们到虚拟机试下(centos 6.2)

1
sudo yum install python-setuptools

如果仓库里没有的话 我们可以手动 wget 当前 python 版本对应的 setuptools 的 egg 然后 sh 安装 这里可以找到地址

1
2
3
4
[vagrant@localhost ~]$ python -V
Python 2.6.6
[vagrant@localhost ~]$ wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
[vagrant@localhost ~]$ sudo sh setuptools-0.6c11-py2.6.egg

pip

…不写了 看参考文档倒数第二条.

参考文献:

Comments