1. 程式人生 > >Python-分發工具初探之-setuptools

Python-分發工具初探之-setuptools

這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。

0x00 setuptools 是什麼

setuptools 與 disutils

我們通常所知道的 Python 分發工具是 Python disutils, setuptools 可以說是它的增強版,它能幫助我們更好的建立和分發 Python 的包,尤其是具有複雜依賴關係的包。對於開發者來說,能夠更好的組織自己專案的分發和釋出;對於使用者來說,不需要安裝 setuputils 也可以使用由它建立的包,只需要一個啟動模組即可。

實現這樣的的包管理機制主要由兩部分構成:

  • 一個儲存在 Python 官方網站的集中式倉庫,名叫 Python Package Index(PyPI)
  • 另外就是基於 disutils 開發的 setuptools 包管理系統

它提供的內容包括:

  • 用來提供標準元資料欄位:諸如作者名、版權型別等資訊的骨架
  • 一組用來將包中的程式碼來構建軟體安裝包的輔助工具

disutils 僅僅適用於包,它無法定義包之間的依賴關係。但是 setuptools 通過新增一個基本的依賴系統以及許多相關功能,彌補了該缺陷。他還提供了自動包查詢程式,用來自動獲取包之間的依賴關係,並完成這些包的安裝,大大降低了安裝各種包的難度,使之更加方便。

相關功能

  • 利用 EasyInstall 自動查詢、下載、安裝升級依賴包
  • 能夠建立 Python Eggs、
  • 包含目錄中的資料檔案和包,不需要在 setup() 函式中一一列舉出來
  • 自動包含包內和釋出有關的所有相關檔案,而不用建立一個 MANIFEST.in檔案
  • 自動生成經過包裝的指令碼
  • 支援Pyrex,即在可以 setup.py 中列出 .pyx 檔案,而終端使用者無須安裝Pyrex
  • 支援上傳到 PyPI
  • 可以部署開發模式,使專案在sys.path中
  • 用新命令或 setup() 引數擴充套件distutils,為多個專案釋出/重用擴充套件
  • 在專案的 setup()中簡單宣告 entry points
    ,建立可以自動發現擴充套件的應用和框架

0x01 安裝 setuptools

**Ubuntu:

sudo apt-get install python-setuptools

Mac:

安裝 wget:

curl -O http://ftp.gnu.org/gnu/wget/wget-1.13.4.tar.gz
tar -xzvf wget-1.13.4.tar.gz
cd wget-1.13.4
./configure
make
sudo make install

安裝 setuputils:

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py

0x02 建立一個簡單的包

建立一個空的包

新建一個 demo 目錄

mkdir demo1
cd demo1

在目錄下新建 setup.py 檔案

from setuptools import setup, find_packages

setup(
name = 'demo1',
version = '0.1',
packages = find_packages(),
)

將該專案打包

python setup.py bdist_egg

這時我們檢視該專案目錄:

demo1
|--build
|   `--bdist.macosx-10.11-intel
|--demo1.egg-info
|  |--dependency_links.txt
|  |--PKG-INFO
|  |--SOURCES.txt
|  `--top_level.txt
|--dist
|  `--demo1-0.1-py2.7.egg
`--setup.py

我們看到在 dist 目錄中的就是生成的 egg 包,將其解壓:

unzip -l demo1-0.1-py2.7.egg

Archive:  demo1-0.1-py2.7.egg
Length     Date   Time    Name
--------    ----   ----    ----
1  03-22-16 23:29   EGG-INFO/dependency_links.txt
177  03-22-16 23:29   EGG-INFO/PKG-INFO
124  03-22-16 23:29   EGG-INFO/SOURCES.txt
1  03-22-16 23:29   EGG-INFO/top_level.txt
1  03-22-16 23:29   EGG-INFO/zip-safe
--------                   -------
304                   5 files

以上的程式是最簡單的一個 setup.py 程式,如果想要釋出到 PyPI 就需要參考官方給出的示例

from setuptools import setup, find_packages
setup(
name = "HelloWorld",
version = "0.1",
packages = find_packages(),
scripts = ['say_hello.py'],

# Project uses reStructuredText, so ensure that the docutils get
# installed or upgraded on the target machine
install_requires = ['docutils>=0.3'],

package_data = {
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.rst'],
# And include any *.msg files found in the 'hello' package, too:
'hello': ['*.msg'],
},

# metadata for upload to PyPI
author = "Me",
author_email = "[email protected]",
description = "This is an Example Package",
license = "PSF",
keywords = "hello world example examples",
url = "http://example.com/HelloWorld/",   # project home page, if any

# could also include long_description, download_url, classifiers, etc.
)

給包中新增內容

我們上邊生成的 egg 是一個空的,沒有實際的內容,現在我們來新增一些內容:

在專案目錄新建一個目錄:

mkdir test
cd test

* 新建 __init__.py,加入如下程式碼:*

#-*- coding:utf-8 -*-

def test():
print "hello world!"  

if __name__ == '__main__':
test()

再次生成 egg 包:

python setup.py bdist_egg

檢視 egg 包內容:

unzip -l demo1-0.1-py2.7.egg
Archive:  demo1-0.1-py2.7.egg
Length     Date   Time    Name
--------    ----   ----    ----
1  03-22-16 23:51   EGG-INFO/dependency_links.txt
177  03-22-16 23:51   EGG-INFO/PKG-INFO
141  03-22-16 23:51   EGG-INFO/SOURCES.txt
5  03-22-16 23:51   EGG-INFO/top_level.txt
1  03-22-16 23:51   EGG-INFO/zip-safe
102  03-22-16 23:48   test/__init__.py
354  03-22-16 23:51   test/__init__.pyc
--------                   -------
781                   7 files

我們看到其中已經多了 test 目錄和 __init__.py,然後我們就可以嘗試安裝一下我們自己的包:

sudo python setup.py install

然後該包就會安裝到 Python 的 site-packages 目錄下,在我的電腦上為 /Library/Python/2.7/site-packages/demo1-0.1-py2.7.egg

這時我們可以在 Python 終端測試我們的包:

Python 2.7.10 (default, Oct 23 2015, 18:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.test()
hello world!

我們看到我們編寫的包已經成功執行!

0x02 總結

這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。

本文的版權歸作者 羅遠航 所有,採用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用於商業用途;轉載請註明出處。感謝配合!

相關推薦

Python-分發工具初探-setuptools

這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。 0x00 setuptools 是什麼

Python打包分發工具setuptools簡介

Python打包分發工具setuptools 通過這個工具,可以打包安裝外掛,並且還可以釋出到PyPI上面,具體參考: 1.http://python.jobbole.com/87240/ 2.http://python.jobbole.com/86443/?utm_source=b

python工具編寫tcp通信編程

images log bsp 服務器 cnblogs 分享 tcp客戶端 數據 輸入 TCP服務器端 實現多線程 可以接入多個客戶端 客戶端輸入數據 在服務端標準輸出出來 服務端向客戶端發送hello world 客戶端輸入exit可以終止程序 TCP客戶端 實現效

python工具編寫paramiko實現SSH遠程連接

編寫 range get missing dede 連接 and try 遠程 客戶端實現有三種方式: 1:用賬號密碼登陸 1.1直接使用SSHClient對象的exec_command()在服務端執行命令: 代碼實現: import paramikoimport sysd

Linux系統管理Python生態工具、文本處理和系統管理

相對 print 重復調用 示例 快捷 python編程 expr markup htm 一、Python生態工具 一、Python內置小工具   1、秒級啟動一個下載服務器   Python 內置了一個下載服務器就能夠顯著提升效率了 。 例如, 你的同事要讓你傳

Python+Selenium中級篇1-Python IDE工具-PyCharm的安裝和簡單使用

       從本文開始陸續介紹一些中級的技能,本篇文章介紹,在Python開發過程中,比較流行,很優秀的一款IDE工具-PyCharm,這裡關於它的介紹就一句話,它就相當於Java開發中的Eclip

Python初探實現機器人聊天+微信自動回覆

最近看到公司程式碼平臺上有小夥伴用Python實現了聊天機器人功能,一直很想學Python卻沒有開始,自己實現一下,整合聊天機器人+接入微信介面實現自動回覆。一、圖靈機器人1. 在圖靈機器人官網註冊一個賬號http://www.turingapi.com/#/platfrom

Python中的Scapy初探六--找出非法的DHCP Server

記得以前在公司時,經常碰到未經授權的DHCP伺服器接入網路,可能是做實驗,沒有把虛擬機器的網路與真實網路遮蔽,這樣就很難搞。而且還遇到一特邪門的事情,VOIP的DHCPServer躥入了使用者網路,導致使用者拿到的是IP電話的IP,通過DHCP獲取IP,就有這個麻煩,誰快就拿

python/socket編程粘包

處理機制 滿了 bytes true src exceptio 協議 粘包問題 時間間隔 python/socket編程之粘包 粘包: 只有TCP有尿包現象,UDP永遠不會粘包。 首先需要掌握一個socket收發消息的原理 發送端可以是1k,1k的發送數據而接受端的應用程

python工具:用python操作HP的Quality Center

over cti 步驟 response headers 服務器 登錄 chm format 背景是這樣的:這個組的測試人員每跑一個case都要上傳測試結果附件到QC。每個待測功能模塊可能包含幾十上百的case。於是手工上傳測試結果變成了繁重的體力勞動。令人驚訝的是我們的工

Python(八)函數

列表 應該 聚合 作用 接收 求階乘 問題 mage 函數式編程 Python函數 函數作用: (1)代碼重用 (2)一種設計工具,分解復雜問題 (3)將相關功能打包並參數化 函數種類: 全局函數:定義在模塊中 局部函數:嵌套在其他函數中 lambda函數:表達

python工具 - alert彈框輸出姓名年齡、求和

sum entry 數字 之間 col import 技術分享 app button 使用python自帶的tkinter庫進行GUI編程,完成兩個功能: (1)要求用戶輸入姓名和年齡然後打印出來 (2)要求用戶輸入一個數字,然後計算1到該數字之間的和 代碼部分: # 導

python selenium 元素操作鍵盤操作(五)

兩個 .com multi 模擬 刪除 del escape comm f11 上節介紹了模擬鼠標對元素的操作,本節主要介紹鍵盤對元素的操作,實際過程中鼠標對元素的操作比鍵盤對元素的操作更經常使用,但是鍵盤對元素的操作也很重要,本節主要介紹一下鍵盤對元素的操作。 selen

python性能優化列表生成

python list 數量級 空間 start 在看python算法時,發現簡單的列表生成,不同的方式性能相差巨大,讓我對性能優化有了很大興趣。大家也來看一看平時有沒有犯類似的錯誤呢。#!/usr/bin/env python import time def test1(n):

python每日一練20170611

python#!/usr/local/bin/python #-*- coding: UTF-8 -*- #端口掃描器 import socket import thread import time socket.setdefaulttimeout(3) #設置了全局默認超時時間 def socket_

Python全棧開發4、內置函數、文件操作和遞歸

開發 hang mon alien yun alpha err fdm ax1 %E5%AD%97%E8%8A%82%E5%BA%8F%E8%BD%AC%E6%8D%A2%E4%B8%8E%E7%BB%93%E6%9E%84%E4%BD%93%E4%BD%8D%E5%9F%

Python基礎篇》初識Python

file dff lam lag port nag elong dir car %E4%BD%BF%E7%94%A8CHttpFile%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%AD%A3%E7%A1%AE%E7%9A%

binutils工具---objdump

objdump content clas 軟件開發 nbsp ont logs span hit 在嵌入式軟件開發中,有時需要知道所生成的程序文件中的段信息以分析問題,或者需要查看c語言對應的匯編代碼,此時,objdump工具就可以幫大忙了。obj——object dum

python部署工具fabric

不同的 pre eric line toolbar ubunt nag file -c 兩臺機器:10.1.6.186、10.1.6.159。fabric部署在10.1.6.186上面 1 執行和1相同的任務,不過排除掉10.1.6.159這臺機器 1 #!/

python第三方模塊paramiko模塊

con comm get res str 文件 stdin path color 目錄: paramiko模塊介紹 paramiko模塊安裝 paramiko模塊使用 一、paramiko模塊介紹 paramiko是一個用於做遠程控制的模塊,使用該模塊可以對遠程服務器進