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