python egg python的egg的製作

2021-10-12 11:00:06 字數 4194 閱讀 4742

首先建立工程目錄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 = "[email protected]",

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 =

這樣告訴setuptools在src目錄下找包,而不是原來預設的工程根目錄。

最後我們來手動的解除安裝以下剛才安裝的egg檔案,以python2.6版本為例,egg檔案一般安裝在/usr/local/lib/python2.6/dist-packages/目錄下,該目錄下還有乙個easy-install.pt**件,用於存放安裝的egg資訊。:

egg中的多程序模型 egg文件搬運工

多程序間的模型 master 在這個模型下,master 程序承擔了程序管理的工作 類似 pm2 不執行任何業務 我們只需要執行起乙個 master 程序它就會幫我們搞定所有的 worker agent 程序的初始化以及重啟等工作了。master 程序的穩定性是極高的,線上執行時我們只需要通過 eg...

Egg 中獲取遠端的資料

egg 提供了 this.ctx.curl 方法獲取遠端的資料,讓我們可以輕鬆的實現乙個簡單的爬蟲功能,以下是乙個使用的具體示例。首先在config資料夾下的 config.default.js 中定義要獲取資料的網域名稱。use strict const config exports use fo...

Egg 中的控制器繼承與相容

專案中多個控制器使用公共的方法時,可以將這些方法寫在乙個基類控制器中,其它的控制器全部繼承於這個基類控制器,這樣基類中的方法就可以在其它的控制器中使用了。定義基類控制器。use strict const controller require egg controller 所有控制器的基類 class...