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

