Python的setuptools详解【1】
一 基本概念
1.什么是setuptools
setuptools是Python distutils增強版的集合,它可以幫助我們更簡單的創建和分發Python包,尤其是擁有依賴關系的。所謂分發,就是將自己做的包,安裝到操作系統內。
強調一點,setuptools是在產生包時候用,到包創作完成后,用戶在使用setuptools創建的包時,并不需要已安裝setuptools,只要一個啟動模塊(__init__.py)即可。
2 setuptools功能亮點:
- 利用EasyInstall自動查找、下載、安裝、升級依賴包
- 創建Python Eggs
- 包含包目錄內的數據文件
- 自動包含包目錄內的所有的包,而不用在setup.py中列舉
- 自動包含包內和發布有關的所有相關文件,而不用創建一個MANIFEST.in文件
- 自動生成經過包裝的腳本或Windows執行文件
- 支持Pyrex,即在可以setup.py中列出.pyx文件,而最終用戶無須安裝Pyrex
- 支持上傳到PyPI
- 可以部署開發模式,使項目在sys.path中
- 用新命令或setup()參數擴展distutils,為多個項目發布/重用擴展
- 在項目setup()中簡單聲明entry points,創建可以自動發現擴展的應用和框架
? ? 總之,setuptools就是比distutils好用的多,基本滿足大型項目的安裝和發布
3 什么是python Eggs
python蛋,是用于將自己開發的安裝包部署到操作系統環境下。由于python在全系統可見,因此,在python程序下,直接import??xxx就可以應用。python蛋就是python代碼,用unzip解壓后,一看便知。
二、安裝setuptools
如果python環境沒有setuptools,需要安裝,下面推薦兩個安裝方法如下:
1) 方法1:最簡單安裝,假定在ubuntu下
- sudo apt-get install python-setuptools
2) 方法2:啟動腳本安裝
- wget?http://peak.telecommunity.com/dist/ez_setup.py
- sudo python ez_setup.py
三 實驗1:創建一個工程,內部有一個程序,并安裝到系統
1.創建一個簡單的包
有了setuptools后,試圖創建一個工程包demo.首先創建一個臨時目錄mydesk用以存放demo工程。在mydesk中,創建一個子目錄(名叫demo),這就是工程的根路徑。
cd /mydesk mkdir demo cd demodemo是工程的根目錄,進入demo,創建根目錄的第一個文件:setup.py文件
from setuptools import setup, find_packages setup(name = "demo",version = "0.1",packages = find_packages(), )在當前目錄下,執行
python3 setup.py bdist_egg
注意這條命令,形如 “ python3 setup.py? xxx”??的命令很多,其中本地生成一個python-egg的命令就是xxx=bdist_egg。本地工程的“打包”動作完成。
ls
?觀察demo文件夾,發現setup.py旁邊多了三個文件目錄:build,demo.egg-info,dist,下面一一介紹其意義。
huatec@LAPTOP-J5TGQHQH:~/mydesk/demo$ tree . ├── build │?? └── bdist.linux-x86_64 ├── demo.egg-info │?? ├── PKG-INFO │?? ├── SOURCES.txt │?? ├── dependency_links.txt │?? └── top_level.txt ├── dist │?? └── demo-0.1-py3.8.egg └── setup.py【1】dist目錄
在dist中生成的是egg包,這是一個將來部署到python系統的文件包,是主要組成部分。
file dist/demo-0.1-py2.7.egg ./dist/demo-0.1-py3.8.egg: Zip archive data, at least v2.0 to extract看一下生成的.egg文件,是個zip包,解開看看先
~/mydesk/demo$ unzip -l ./dist/demo-0.1-py3.8.eggArchive: ./dist/demo-0.1-py3.8.eggLength Date Time Name --------- ---------- ----- ----176 2021-11-10 09:36 EGG-INFO/PKG-INFO120 2021-11-10 09:36 EGG-INFO/SOURCES.txt1 2021-11-10 09:36 EGG-INFO/dependency_links.txt1 2021-11-10 09:36 EGG-INFO/top_level.txt1 2021-11-10 09:36 EGG-INFO/zip-safe --------- -------299 5 files huatec@LAPTOP-J5TGQHQH:~/mydesk/demo$我們可以看到,里面是一系列自動生成的文件?,F在可以介紹一下剛剛setup()中的參數了
name 包名 version 版本號 packages 所包含的其他包要想發布到PyPI中,需要增加別的參數,這個可以參考官方文檔中的例子了。
【2】 demo.egg-info目錄
此文件夾下,包含所有的,對python-egg的描述文件,是次要組成部分。
【3】build目錄
此目錄是具有C++、C語言的程序,編譯過后的可調用庫存在的地方,在python下一般不用。此文件夾是工程的重要組成部分。
上面生成的egg中沒有實質的內容,除了可以看看結構,沒有實際意義,下面添加一點內容。
2.在簡單的包內追加一個程序
在demo中執行mkdir demo,再創建一個目錄,在這個demo目錄中創建一個__init__.py的文件,表示這個目錄是一個包,然后寫入:
#!/usr/bin/env python #-*- coding:utf-8 -*-def test():print("hello world!")if __name__ == '__main__':test()現在的主目錄結構為下:
demo |-- demo | `-- __init__.py `-- setup.py 再次執行python setup.py bdist_egg后,再看egg包$ unzip -l ./dist/demo-0.1-py3.8.eggArchive: ./dist/demo-0.1-py3.8.eggLength Date Time Name --------- ---------- ----- ----176 2021-11-10 11:15 EGG-INFO/PKG-INFO137 2021-11-10 11:15 EGG-INFO/SOURCES.txt1 2021-11-10 11:15 EGG-INFO/dependency_links.txt5 2021-11-10 11:15 EGG-INFO/top_level.txt1 2021-11-10 11:15 EGG-INFO/zip-safe124 2021-11-10 11:12 demo/__init__.py379 2021-11-10 11:15 demo/__pycache__/__init__.cpython-38.pyc --------- -------823 7 files這回包內多了demo目錄,顯然已經有了我們自己的東西了.下一步將其安裝到python系統。
python setup.py install這個命令會講我們創建的egg安裝到python的dist-packages目錄下,我這里的位置在
tree /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg查看一下它的結構:
$ unzip -l /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.eggArchive: /usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.eggLength Date Time Name --------- ---------- ----- ----176 2021-11-10 11:23 EGG-INFO/PKG-INFO137 2021-11-10 11:23 EGG-INFO/SOURCES.txt1 2021-11-10 11:23 EGG-INFO/dependency_links.txt5 2021-11-10 11:23 EGG-INFO/top_level.txt1 2021-11-10 11:23 EGG-INFO/zip-safe124 2021-11-10 11:12 demo/__init__.py379 2021-11-10 11:23 demo/__pycache__/__init__.cpython-38.pyc --------- -------823 7 files打開python終端或者ipython都行,直接導入我們的包
>>> import demo >>> demo.test() hello world! >>>好了,執行成功!
這里強調:egg文件中已經包含所有關于源程序,以及路徑的信息。與/usr/local/lib/python3.8/dist-packages/下存放路徑和文件完全等價
?sudo unzip? ?/usr/local/lib/python3.8/dist-packages/demo-0.1-py3.8.egg
將看到生成程序文件路徑和說明文件路徑。再次強調:egg就是執行程序。?
總結
以上是生活随笔為你收集整理的Python的setuptools详解【1】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索爱麦克风免驱动的语音录入测试
- 下一篇: ubuntu下安装java和tomcat