python setup
使用Python以來,基本不可逃避的就是setup.py文件,因為我們要安裝各種各樣的python軟件或者其它第三方package,但是經常使用python setup.py install進行安裝,卻不甚明白該文件的工作原理。由於目前工作涉及了openstack,一個基於python的雲操作系統,因此,理解一些python的基本知識是必須要的。故找時間了解了基本的python setup.py文件的制作。
一、一個簡單的setup.py文件:
比如,我們經常使用的一個SSH的package:paramiko,其用於建立基於ssh協議的會話,下載地址為:https://github.com/paramiko/paramiko。
打開其中的setup.py文件,簡單註釋,如下所示:
[python] view plain copy

- import sys
- from setuptools import setup # setuptool工具
- if sys.platform == 'darwin':
- import setup_helper
- setup_helper.install_custom_make_tarball()
- # version info -- read without importing
- _locals = {}
- with open('paramiko/_version.py') as fp: # 獲取paramiko文件的version號,註冊到paramiko中
- exec(fp.read(), None, _locals)
- version = _locals['__version__'] # 寫入到dict中
- # 介紹:https://docs.python.org/3/distutils/setupscript.html
- setup(
- # meta-data數據,此外還有maintainer,maintainer_email,
- # 其中name、version、url是必須的
- name = "paramiko", # package name
- version = version, # package version
- description = "SSH2 protocol library", # 簡要描述
- long_description = longdesc, # 一般用於讀取readme.txt文件的內容。。。在package發布到pypi上的時候,這項是必須的,作為package介紹
- author = "Jeff Forcier", # pacakge author
- author_email = "[email protected]", # author's email
- url = "https://github.com/paramiko/paramiko/", # 下載地址
- packages = [ 'paramiko' ], # 安裝包,這裏會去檢索paramiko/__init__.py文件。。。也就是告訴distutils時需要處理哪些包
- license = 'LGPL', # license授權
- platforms = 'Posix; MacOS X; Windows', # 平臺
- # classifiers分類
- classifiers = [
- 'Development Status :: 5 - Production/Stable',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
- 'Operating system :: OS Independent',
- 'Topic :: Internet',
- 'Topic :: Security :: Cryptography',
- 'Programming Language :: Python',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.6',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.2',
- 'Programming Language :: Python :: 3.3',
- 'Programming Language :: Python :: 3.4',
- 'Programming Language :: Python :: 3.5',
- ],
- # 依賴包,有幾種符號
- install_requires=[
- 'cryptography>=1.1',
- 'pyasn1>=0.1.7',
- ],
- )
Setup腳本是利用distutils進行編譯、發包、安裝模塊的主要腳本。Setup主要的目的是將我們的發布包按照distutils描述的方式組織,方便開發安裝。
其實,在setup.py文件中,主要包含以下內容:
S1、列出所有的packages,使用關鍵字packages和package_dir兩個;
S2、列出所有的依賴模塊,使用py_modules;
S3、列出擴展模塊,包括擴展名和包、源代碼文件、預處理選項如include、library選項,以及其它的一些選項;
S4、文件發布版與依賴包的關系,使用==、>=、!=、<等
S5、直接安裝scripts文件,使用scripts關鍵字;
S6、安裝package data,使用package_data;
S7、安裝一些其他文件,使用data_files;
S8、額外的meta-data數據,包括version、name、author、classifiers等,網址上介紹了meta-data數據的東西,這個是setup.py文件中必須的參數:
上面的(1)表示該字段是setup文件中必須的。這個就是我們當前的setup文件的編排格式。
二、setup文件使用:
理解了setup.py文件裏面的字段含義,那麽我們就可以學習setup文件的使用了,其主要有以下幾種方式:
python setup.py build #編譯
python setup.py install #安裝,最基本的安裝方式
python setup.py sdist #制作分發包,制作一個源碼包,格式為zip/tar.gz
python setup.py bdist_egg #制作一個二進制分發包
python setup.py bdist_wininst #制作windows下的分發包,exe程序
python setup.py bdist_rpm #制作linux下的rpm包,需要rpm程序支持
下面我們開始編寫一個setup.py文件,內容如下:
[python] view plain copy


- from distutils.core import setup
- setup(
- name = 'myfirsttest',
- version = '1.0',
- py_modules = ['myfirsttest']
- )
執行python setup.py sdist後,會生成一個文件包,裏面會有對應的源碼包:
到時候,客戶端拿到這個壓縮包後,解壓,並執行python setup.py install就可以進行安裝。
三、setup.cfg文件:
Stackflow上的解釋:
http://stackoverflow.com/questions/27077355/how-to-use-setup-cfg-instead-of-setup-py-with-python-2-7
The problem is that the setup.cfg file does not do what you want. It does not provide parameters to the setup function. It is used to supply parameters to the commands that setup.py makes available. You can list the supported commands with setup.py --help-commands. You should see something like:
Setup.cfg並不是setup函數中的參數,而是setup.py文件中的一些參數,可以使用setup.py --help-commands命令查看:
這只是python setup.py的參數,但是這並不是直接需要寫入setup.cfg文件中的。具體的,還要再繼續查看,比如,sdist命令可使用的參數如下:
可以看到,當我們需要制作源碼的時候,可以使用verbose、quiet等參數,這就是我們需要寫入setup.cfg文件中的。
而setup.cfg的文件中是按照section去處理的,比如:
比如,當我們setup.cfg中如下時:
當我們執行python setup.py build安裝的時候,實際執行的是如下命令:
參考:https://docs.python.org/2/install/index.html#distutils-configuration-files
四、distutils介紹:
setuptool通過封裝distutils,簡化了package的安裝過程。Distutils,全稱為:Python
Distribution Utilities,從python 1.6以來,distutils已經成為python標準庫的一部分,極大的簡化了用戶安裝新模塊、第三方包和標準工具,並且創建這些distribution的方式也極大的簡化了。Distutils既為支持RPM的linux提供了創建RPM的方式,也提供了制作windows exe的方式。Distutils通過將setup.py、setup.cfg、source code、第三方編譯包集成在一起,做成可用的package。
Distutils統一了linux和windows下python的安裝方式,並不區分是rpm包還是tarball方式,只是執行python setup.py install即可進行安裝。並且,可以令不同的開發者向同一塊package進行工作。
一般來講,我們會依次執行build和install,其中build會將所有的源文件進行編譯,並放到同對應目錄下,生成build/lib文件,源文件不限於python,也可以是C/C++。如果考慮到build的速度,可以使用--buuld-base指定build的目錄。編譯完成後,使用install安裝,安裝的過程,是將該目錄下的文件拷貝到對應的代碼目錄下。
我們默認的安裝目錄是:
如果是默認的話,一般是標準的python安裝目錄,linux下一般prefix和exec-prefix是/usr,而windows下是C:\Program Files\Python,可以采用如下方式查詢安裝目錄:
我們可以使用如下參數去指定install的方式:
S1、--user:linux下的用戶選擇,確保該用戶對安裝目錄有權限;
S2、--home:指定安裝目錄:
可以與--install-purelib、--install-scripts、--install-platlib、--install-data組合使用,確認各個子條目的安裝目錄。
S3、--prefix:指定安裝目錄的前綴,如果目錄不存在,則會創建一個
S4、--exe-prefix:制定擴展模塊的安裝目錄前綴
S5、--install-scripts:指定scripts的安裝目錄,可以與--home、--prefix組合使用
--install-base
S6、--install-platbase
我們的配置參數有很多,但是setuptools為我們提供了一個合理的方式,就是專有的配置文件
Windows下的配置文件為:
Linux下的配置文件為:
這也就是我們經常看到的setup.cfg文件的作用,裏面的配置可以如下:
當我們安裝完成後,python會按照目錄去搜素安裝的包,其搜素的路徑在sys模塊中:
Sys.path中為空的表示當前目錄,當我們需要搜索某一目錄的時候,可以將該目錄加入到sys.path中。也可以通過PATHHOME設置更改目錄。
distutils官網:https://docs.python.org/2/distutils/
五、setup和pip安裝的方式區別:
|
Setup |
Pip |
相同 |
1.包安裝 |
1.包安裝 |
不同 |
1.手動下載; 2.沒有統一的管理; 3.Easy_install會調用setuptool進行安裝 |
1.自動下載; 2.自動管理包,更新卸載更方便,執行pip uninstall即可; 3.提供了對virtualenv的管理 |
Tags: 下載地址 version package without 工作原理
文章來源: