1. 程式人生 > >關於python中的setup.py

關於python中的setup.py

本文是轉載的,源地址:http://lingxiankong.github.io/blog/2013/12/23/python-setup/

感謝作者,解決了我一個大問題

其實對於setup.py和setup.cfg的關注是從OpenStack的原始碼包中開始的,OpenStack每個元件的釋出時都是一個tar.gz包,同樣,我們直接從github上clone程式碼後也會發現兩個檔案的存在。當閱讀Nova或Ceilometer(其他元件可能也會涉及)的程式碼時,發現setup.cfg中內容對於程式碼的理解有很大的影響。那麼,到底setup.py和setup.cfg是幹什麼的?

我們從例子開始。假設你要分發一個叫foo的模組,檔名foo.py,那麼setup.py內容如下:

  1. from distutils.core import setup
  2. setup(name='foo',
  3. version='1.0',
  4. py_modules=['foo'],
  5. )

然後,執行python setup.py sdist為模組建立一個原始碼包

  1. [email protected]:/kong/setup# python setup.py sdist
  2. running sdist
  3. running check
  4. warning: check: missing required meta-data: url
  5. warning: check: missing meta-data: either
    (author and author_email)or(maintainer and maintainer_email) must be supplied
  6. warning: sdist: manifest template'MANIFEST.in' does not exist (usingdefault file list)
  7. warning: sdist: standard file not found: should have one of README, README.txt
  8. writing manifest file 'MANIFEST'
  9. creating foo-1.0
  10. making hard links
    in foo-1.0...
  11. hard linking foo.py -> foo-1.0
  12. hard linking setup.py -> foo-1.0
  13. creating dist
  14. Creating tar archive
  15. removing 'foo-1.0'(and everything under it)

在當前目錄下,會建立dist目錄,裡面有個檔名為foo-1.0.tar.gz,這個就是可以分發的包。使用者拿到這個包後,解壓,到foo-1.0目錄下執行:python setup.py install,那麼,foo.py就會被拷貝到python類路徑下,可以被匯入使用。

  1. [email protected]:/kong/setup/dist/foo-1.0# python setup.py install
  2. running install
  3. running build
  4. running build_py
  5. creating build
  6. creating build/lib.linux-x86_64-2.7
  7. copying foo.py -> build/lib.linux-x86_64-2.7
  8. running install_lib
  9. copying build/lib.linux-x86_64-2.7/foo.py ->/usr/local/lib/python2.7/dist-packages
  10. byte-compiling /usr/local/lib/python2.7/dist-packages/foo.py to foo.pyc
  11. running install_egg_info
  12. Removing/usr/local/lib/python2.7/dist-packages/foo-1.0.egg-info
  13. Writing/usr/local/lib/python2.7/dist-packages/foo-1.0.egg-info
  14. [email protected]:/kong/setup/dist/foo-1.0# ll /usr/local/lib/python2.7/dist-packages/foo
  15. foo-1.0.egg-info foo.py foo.pyc

對於Windows,可以執行python setup.py bdist_wininst生成一個exe檔案;若要生成RPM包,執行python setup.py bdist_rpm,但系統必須有rpm命令的支援。可以執行下面的命令檢視所有格式的支援:

  1. [email protected]:/kong/setup# python setup.py bdist --help-formats
  2. List of available distribution formats:
  3. --formats=rpm RPM distribution
  4. --formats=gztar gzip'ed tar file
  5. --formats=bztar bzip2'ed tar file
  6. --formats=ztar compressed tar file
  7. --formats=tar tar file
  8. --formats=wininst Windows executable installer
  9. --formats=zip ZIP file
  10. --formats=msi MicrosoftInstaller

setup函式還有一些引數:

1、packages
告訴Distutils需要處理那些包(包含__init__.py的資料夾)
2、package_dir
告訴Distutils哪些目錄下的檔案被對映到哪個原始碼包。一個例子:package_dir = {'': 'lib'},表示“root package”中的模組都在lib目錄中。
3、ext_modules
是一個包含Extension例項的列表,Extension的定義也有一些引數。
4、ext_package
定義extension的相對路徑
5、requires
定義依賴哪些模組
6、provides
定義可以為哪些模組提供依賴
7、scripts
指定python原始碼檔案,可以從命令列執行。在安裝時指定--install-script
8、package_data
通常包含與包實現相關的一些資料檔案或類似於readme的檔案。如果沒有提供模板,會被新增到MANIFEST檔案中。
9、data_files
指定其他的一些檔案(如配置檔案)

  1. setup(...,
  2. data_files=[('bitmaps',['bm/b1.gif','bm/b2.gif']),
  3. ('config',['cfg/data.cfg']),
  4. ('/etc/init.d',['init-script'])]
  5. )

規定了哪些檔案被安裝到哪些目錄中。如果目錄名是相對路徑,則是相對於sys.prefixsys.exec_prefix的路徑。如果沒有提供模板,會被新增到MANIFEST檔案中。

執行sdist命令時,預設會打包哪些東西呢?

  • 所有由py_modulespackages指定的原始碼檔案
  • 所有由ext_moduleslibraries指定的C原始碼檔案
  • scripts指定的指令碼檔案
  • 類似於test/test*.py的檔案
  • README.txt或README,setup.py,setup.cfg
  • 所有package_datadata_files指定的檔案

還有一種方式是寫一個manifest template,名為MANIFEST.in,定義如何生成MANIFEST檔案,內容就是需要包含在分發包中的檔案。一個MANIFEST.in檔案如下:

  1. include *.txt
  2. recursive-include examples *.txt *.py
  3. prune examples/sample?/build

setup.cfg提供一種方式,可以讓包的開發者提供命令的預設選項,同時為使用者提供修改的機會。對setup.cfg的解析,是在setup.py之後,在命令列執行前。

setup.cfg檔案的形式類似於

  1. [command]
  2. option=value
  3. ...

其中,command是Distutils的命令引數,option是引數選項,可以通過python setup.py --help build_ext方式獲取。

需要注意的是,比如一個選項是--foo-bar,在setup.cfg中必須改成foo_bar的格式

符合Distutils2的setup.cfg有些不同。包含一些sections:
1、global
定義Distutils2的全域性選項,可能包含commands,compilers,setup_hook(定義指令碼,在setup.cfg被讀取後執行,可以修改setup.cfg的配置)
2、metadata
3、files

  • packages_root:根目錄
  • packages
  • modules
  • scripts
  • extra_files

4、command sections

上面的setup.py和setup.cfg都是遵循python標準庫中的Distutils,而setuptools工具針對Python官方的distutils做了很多針對性的功能增強,比如依賴檢查,動態擴充套件等。很多高階功能我就不詳述了,自己也沒有用過,等用的時候再作補充。

一個典型的遵循setuptools的指令碼:

  1. from setuptools import setup, find_packages
  2. setup(
  3. name ="HelloWorld",
  4. version ="0.1",
  5. packages = find_packages(),
  6. scripts =['say_hello.py'],
  7. # Project uses reStructuredText, so ensure that the docutils get
  8. # installed or upgraded on the target machine
  9. install_requires =['docutils>=0.3'],
  10. package_data ={
  11. # If any package contains *.txt or *.rst files, include them:
  12. '':['*.txt','*.rst'],
  13. # And include any *.msg files found in the 'hello' package, too:
  14. 'hello':['*.msg'],
  15. },
  16. # metadata for upload to PyPI
  17. author ="Me",
  18. author_email ="[email protected]",
  19. description ="This is an Example Package",
  20. license ="PSF",
  21. keywords ="hello world example examples",
  22. url ="http://example.com/HelloWorld/",# project home page, if any
  23. # could also include long_description, download_url, classifiers, etc.
  24. )
  1. setup(
  2. # other arguments here...
  3. entry_points ={
  4. 'setuptools.installation':[
  5. 'eggsecutable = my_package.some_module:main_func',
  6. ]
  7. }
  8. )
  1. setup(
  2. name="Project-A",
  3. ...
  4. extras_require ={
  5. 'PDF':["ReportLab>=1.2","RXP"],
  6. 'reST':["docutils>=0.3"],
  7. }
  8. )

特性如何使用呢?需要與entry points結合使用:

  1. setup(
  2. name="Project-A",
  3. ...
  4. entry_points ={
  5. 'console_scripts':[
  6. 'rst2pdf = project_a.tools.pdfgen [PDF]',
  7. 'rst2html = project_a.tools.htmlgen',
  8. # more script entry points ...
  9. ],
  10. }
  11. 相關推薦

    python setup.py 使用方式

    #python setup.py --help-commands Standard commands: build:      build everything needed to install build_py:  

    Python__init__.py文件作用之我見

    __init__.py python 在Python中每次創建一個package後都會自動生成一個 __init__.py‘空文件;該問價的作用是:聲明我們當前創建的文件夾(包)是一個**Python模塊**,在Python中每一個包中必須有一個__init__ .py文件. 一般這個文件都為空,只

    python工具-setup.py

    一、pip install 與 python setup.py install區別 pip install 模組名:線上安裝,會安裝相關的依賴包。 python setup.py install:下載原始碼後本地安裝,不會安裝依賴包。

    也說說Python__init__.py的作用

    以一個貓狗識別的程式為例,說說__init__.py的作用。 在windows的cmd命令列中,使用下面指令把所在路徑下面的所有檔案以樹的形式列出。 tree /F > D:\tree.txt  我手頭上的一個使用knn進行貓狗分類的專案,包含有以下的檔案。

    pythonsetup.py檔案

    最近工作需要,用Cython寫了*.pyx擴充套件,並將其編譯成C檔案,最後轉換為so擴充套件,供python引用使用 distutils 編譯,建立一個setup.py 的指令碼from distutils.core import setupfrom distutils

    pythonsetup.py檔案及其常用命令

    編寫setup.py檔案,獲取幫助:python setup.py --help-commands [python]  Standard commands:    build             build everything needed to install

    pythonsetup.py詳解

    前言 其實對於setup.py和setup.cfg的關注是從OpenStack的原始碼包中開始的,OpenStack每個元件的釋出時都是一個tar.gz包,同樣,我們直接從github上clone程式碼後也會發現兩個檔案的存在。當閱讀Nova或Ceilometer(其

    關於pythonsetup.py

    本文是轉載的,源地址:http://lingxiankong.github.io/blog/2013/12/23/python-setup/ 感謝作者,解決了我一個大問題 前言 其實對於setup.py和setup.cfg的關注是從OpenStack的原始碼包中開始

    python自動化部署setup.py的寫法

    編寫python的第三方庫,最重要的一個工作就是編寫setup.py了,如果我們下載過一些第三庫的原始碼檔案,開啟之後一般就會有一個setup.py,執行python setup.py install 就可以安裝這個庫了。setup.py 如何編寫內容很多,可以參考官方文件:

    python 編寫簡單的setup.py

    ria 如何 代碼 使用 文本 highlight ttl pac 文件夾   學習python也已經有一段時間了,發現python作為腳本語言一個很重要的特點就是簡單易用,而且擁有巨多的第三方庫,幾乎方方面面的庫都有,無論你處於哪個行業,想做什麽工作,幾乎都能找到對應的第

    解決安裝ipython時Command "python setup.py egg_info" failed with error code 1 in /tmp

    ipython pip failed python2.7 ipython 6.0+ 最近使用ubuntu16.04 server版安裝ipython的時候一直在報錯:IPython 6.0+ does not support Python 2.6, 2.7, 3.0, 3.1, or 3.

    python:用setup.py安裝第三方包packages

    span 步驟 tex size 三方 href target stat data python:用setup.py安裝第三方包packages 原創 2016年12月10日 15:17:56 標簽: python 8531 這

    通過setup.py安裝的python軟件包

    body setup.py div nbsp 軟件包 bsp pytho pos 安裝 安裝:sudo python setup.py install 卸載:sudo python setup.py install --record log sudo

    python__init__.py的作用

    TE 有一個 編輯 from In 作用 SQ col clas 1、__init__.py定義包的屬性和方法   一般為空文件,但是必須存在,沒有__init__.py表明他所在的目錄只是目錄不是包 2、導入包的時候使用   例如有一個test目錄,test下

    python pip安裝報錯python setup.py egg_info failed with error code 1

    setup all get setup.py target pip升級 升級 col python版本 安裝locust遇到點問題折騰了好一會兒,記錄一下。 使用命令pip install locustio提示python setup.py egg_info failed

    解決Python3安裝turtle提示錯誤:Command "python setup.py egg_info" failed with error code 1

    pip install turtle 出現 可以選擇升級 setuptools pip install --upgrade setuptools   升級完成後,還是會出現錯誤的話,就手動選擇更改檔案 按照給定的連結,下載turtle包,手動解壓,修改setu

    解決Command "python setup.py egg_info" failed with error code 問題

    當執行命令時  會出現這種情況  Command "python setup.py egg_info" failed with error code 出現這種情況的話,應該是 setuptools 沒有安裝。 開啟窗口出入 cmd 命令,輸入 pip ins

    python setup.py install 報錯:error: [WinError 3] 系統找不到指定的路徑。: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib

    Outline 在通過 setup.py 安裝python模組時,遇到了以下報錯: # 執行 python setup.py install # 報錯: error: [WinError 3] 系統找不到指定的路徑。: 'C:\\Program Files (x86)\\Microsof

    pycharm18.2.4 + Python3.7.1 安裝salt報錯python pip install salt: Command "python setup.py egg_info" failed with error code 10 及解決方法

    最近在使用Python3.7.1 + pycharm + salt編寫程式中需要用到salt模組,但是在pycharm中使用pip install salt 安裝時出現錯誤:   1、提示需要 microsoft visual c++ 14.0     解決方法:可以去官網http://land

    在windows上解決Command "python setup.py egg_info" fail

    在windows上解決Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-vXo1W3/pycurl問題 下截PyCurl庫 下載地址:https://www.lfd.uci.edu/~gohlk