Python?Setuptools的?setup.py實(shí)例詳解
Python 的 setup.py
背景
pip 是最主流的包管理方案,使用
pip install xxx
pip 無法正常下載Python模塊,或者需要在離線環(huán)境及無網(wǎng)絡(luò)環(huán)境安裝Python包的時(shí)候,可以采用安裝 .whl文件或者setup.py文件的方式。
一般的可以在下面的這個(gè)網(wǎng)站找到: https://pypi.org/
下載對(duì)應(yīng)的包的whl文件,然后執(zhí)行
pip install XXX.whl
在安裝普通的python包時(shí),利用pip工具相當(dāng)簡(jiǎn)單。采用setup.py去構(gòu)建環(huán)境,將自己寫的模塊以及相應(yīng)的依賴庫一起打包,用setup去完成這個(gè)任務(wù)。 所以很多github代碼都提供setup.py方便我們一鍵安裝。
如果您下載的軟件包在根文件夾中具有“ setup.py”,則可以通過運(yùn)行以下命令進(jìn)行安裝:
python setup.py install
如果你想安裝一個(gè)模塊但又不想安裝pip,那么唯一的選擇就是從setup.py文件安裝模塊。這可以通過python setup.py install。
什么是setup.py、setuptools
官網(wǎng):Building and Distributing Packages with Setuptools
參考URL: https://setuptools.pypa.io/en/latest/setuptools.html
setup.py是一個(gè) python 文件,它的存在表明您要安裝的模塊/包可能已經(jīng)用 Setuptools 打包和分發(fā),這是分發(fā) Python 模塊的標(biāo)準(zhǔn)。 它的目的是正確安裝軟件。
setuptools是python自帶的用來構(gòu)建包的工具,構(gòu)建出來的wheel(.whl)可供其他人pip install和import。
總之,setuptools就是比distutils好用的多,基本滿足大型項(xiàng)目的安裝和發(fā)布!
一個(gè)最基本的”setup.py”文件如下:
#coding:utf8 from setuptools import setup setup( name='MyApp', # 項(xiàng)目名 version='1.0', # 版本號(hào) packages=['myapp'] # 包括在安裝包內(nèi)的Python包 )
什么是setuptools
setuptools官方文檔:https://setuptools.readthedocs.io
distutils 是標(biāo)準(zhǔn)庫中負(fù)責(zé)建立 Python 第三方庫的安裝器,使用它能夠進(jìn)行 Python 模塊的安裝和發(fā)布。
setuptools 是 distutils 增強(qiáng)版,不包括在標(biāo)準(zhǔn)庫中。其擴(kuò)展了很多功能,能夠幫助開發(fā)者更好的創(chuàng)建和分發(fā) Python 包。大部分 Python 用戶都會(huì)使用更先進(jìn)的 setuptools 模塊。
Setuptools 提供一流的setup.py文件支持作為配置機(jī)制。setup.py 調(diào)用了 setuptools 包中的setup方法。
然而,重要的是要記住,強(qiáng)烈建議不要將此文件作為腳本(例如)運(yùn)行,并且大多數(shù)命令行界面已經(jīng)(或?qū)⒁売?(例如,…)。python setup.py sdistpython setup.py installpython setup.py bdist_wininst
** 我們還建議用戶通過pyproject.toml
或 setup.cfg
以更具聲明性的方式公開盡可能多的配置,并僅使用動(dòng)態(tài)部分保持最小化(如果適用,甚至完全省略)**。setup.py有關(guān)更多背景信息,請(qǐng)參閱為什么不應(yīng)該直接調(diào)用 setup.py 。
setup.py命令
查看所有支持的命令:
python setup.py --help-commands
構(gòu)建安裝時(shí)所需的所有內(nèi)容:
python setup.py build
安裝包到系統(tǒng)環(huán)境中。該命令會(huì)將當(dāng)前項(xiàng)目安裝到當(dāng)前Python環(huán)境的”site-packages”目錄下,這樣其他項(xiàng)目就可以像導(dǎo)入標(biāo)準(zhǔn)庫一樣導(dǎo)入該項(xiàng)目的代碼了。
python setup.py install
以開發(fā)方式安裝包:
如果項(xiàng)目在開發(fā)過程中會(huì)頻繁變更,每次安裝還需要先將原來的版本卸掉,會(huì)很麻煩。使用”develop”開發(fā)方式安裝的話,項(xiàng)目代碼不會(huì)真的被拷貝到本地Python環(huán)境的”site-packages”目錄下,而是在”site-packages”目錄里創(chuàng)建一個(gè)指向當(dāng)前項(xiàng)目位置的鏈接。這樣如果當(dāng)前位置的源碼被改動(dòng),就會(huì)馬上反映到”site-packages”里。
python setup.py develop
用于包的上傳發(fā)布:
python setup.py register
setup.py內(nèi)容 生成可執(zhí)行文件的分發(fā)(安裝到指定路徑)
參考URL: https://amir.rachum.com/blog/2017/07/28/python-entry-points/
網(wǎng)上demo:
# 用來支持自動(dòng)生成腳本,安裝后會(huì)自動(dòng)生成 /usr/bin/pmm 的可執(zhí)行文件(windows管理員權(quán)限下會(huì)在Python文件夾的script里面生成pmm.exe) # 該文件入口指向 pimm/pimm_module.py 的main 函數(shù) entry_points={'console_scripts': ['pmm=pimm.pimm_module:main']}, # 將 bin/foo.sh 和 bar.py 腳本,生成到系統(tǒng) PATH中 # 執(zhí)行 python setup.py install 后 # 會(huì)生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py scripts=['bin/foo.sh', 'bar.py']
將python模塊轉(zhuǎn)變?yōu)槊钚泄ぞ?
如果我們希望 module 中的函數(shù)不僅僅只是被其他 python 程序通過 import 調(diào)用,還可以直接在命令行中執(zhí)行,那么可以做如下修改:(設(shè)置參數(shù)entry_points里的’console_scripts’)
# greeting_module.py import pyjokes def greeting_func(name): print("Hello,", name) print("Here is a joke for you:\n", pyjokes.get_joke()) def main(): import sys arg = sys.argv[1] greeting_func(arg)
# setup.py from setuptools import setup, find_packages setup( # ..., entry_points={ # 設(shè)置了在命令行中如何使用greeting_module中的main函數(shù) 'console_scripts': [ 'greeting=greeting_pkg.greeting_module:main' # <command>=<package>.<module>:<function> ] } )
引入非Python文件
如果想引入靜態(tài)文件,如JS、CSS、圖片等,怎么做?
在項(xiàng)目根目錄下添加一個(gè)”MANIFEST.in”文件夾。假設(shè)我們把所有靜態(tài)文件都放在”static”子目錄下,
我們?cè)谇鍐挝募?rdquo;MANIFEST.in
”中,列出想要在包內(nèi)引入的目錄路徑:
recursive-include myapp/static * recursive-include myapp/xxx *
recursive-include表明包含子目錄。
在”setup.py”中將include_package_data參數(shù)設(shè)為True:
#coding:utf8 from setuptools import setup setup( name='MyApp', # 項(xiàng)目名 version='1.0',# 版本號(hào) packages=['myapp'], # 包括在安裝包內(nèi)的Python包 include_package_data=True # 啟用清單文件MANIFEST.in )
如果你想排除一部分文件,可以在”setup.py”中使用exclude_package_date參數(shù):
setup( ... include_package_data=True, # 啟用清單文件MANIFEST.in exclude_package_date={'':['.gitignore']} )
依賴管理
我們的項(xiàng)目會(huì)依賴其他Python模塊,如何在setup.py中管理這些依賴呢?
修改”setup.py”文件,加入install_requires參數(shù):
#coding:utf8 from setuptools import setup setup( name='MyApp', # 項(xiàng)目名 version='1.0',# 版本號(hào) packages=['myapp'], # 包括在安裝包內(nèi)的Python包 include_package_data=True, # 啟用清單文件MANIFEST.in exclude_package_date={'':['.gitignore']}, install_requires=[ # 依賴列表 'Flask>=0.10', 'Flask-SQLAlchemy>=1.5,<=2.1' ] )
可以通過dependency_links指定依賴包下載路徑。install_requires中的包在安裝時(shí)會(huì)先去PyPI下載并安裝,如果包在PyPI中找不到,則會(huì)從dependency_links標(biāo)識(shí)的URL中獲取:
setup( ... install_requires=[ # 依賴列表 'Flask>=0.10', 'Flask-SQLAlchemy>=1.5,<=2.1' ], dependency_links=[ # 依賴包下載路徑 'http://example.com/dependency.tar.gz' ] )
路徑應(yīng)指向一個(gè)”egg”包或”tar.gz”包,也可以是個(gè)包含下載地址(一個(gè)”egg”包或”tar.gz”包)的頁面。
編寫 setup.py 文件, setup.py是python模塊分發(fā)與安裝的指導(dǎo)文件。
有了setup.py文件,運(yùn)行下面這條命令,可以進(jìn)行模塊的安裝。
與 .whl文件一樣,先cmd到指定位置,然后輸入:
python setup.py install
安裝
$ pip install setuptools
到此這篇關(guān)于Python Setuptools的 setup.py的文章就介紹到這了,更多相關(guān)Python setup.py內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python numpy 提取矩陣的某一行或某一列的實(shí)例
下面小編就為大家分享一篇Python numpy 提取矩陣的某一行或某一列的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python交互環(huán)境下打印和輸入函數(shù)的實(shí)例內(nèi)容
在本篇文章里小編給大家分享的是關(guān)于Python交互環(huán)境下打印和輸入函數(shù)的實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02Python設(shè)計(jì)模式中的狀態(tài)模式你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python設(shè)計(jì)模式中的狀態(tài)模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02使用scipy.optimize的fsolve,root函數(shù)求解非線性方程問題
這篇文章主要介紹了使用scipy.optimize的fsolve,root函數(shù)求解非線性方程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Python檢測(cè)一個(gè)對(duì)象是否為字符串類的方法
這篇文章主要介紹了Python檢測(cè)一個(gè)對(duì)象是否為字符串類的方法,即檢測(cè)是一個(gè)對(duì)象是否是字符串對(duì)象,本文還講解了一個(gè)有趣的判斷方法,需要的朋友可以參考下2015-05-05Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript
爬蟲的開發(fā)過程中,往往需要對(duì)JS進(jìn)行模擬,簡(jiǎn)單或者通用的還可以在Python中模擬或者找到對(duì)應(yīng)的第三方庫,但是復(fù)雜的就可能不好實(shí)現(xiàn)了,下面這篇文章主要給大家介紹了關(guān)于Python使用execjs執(zhí)行包含中文參數(shù)的JavaScript的相關(guān)資料,需要的朋友可以參考下2022-03-03