Python包管理工具setuptools使用
什么事setuptools
setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。setuptools可以说相当的简单易用,它会随着Python一起安装,你只需要写一个简短的setup.py文件就可以将你的Python应用打包。
功能亮点
利用EasyInstall自动查找、下载、安装、升级依赖包
创建Python Eggs
包含包内的数据文件
支持上传到PyPi
可以部署开发模式,使用项目在sys.path中
setuptools要比distutils好用的多,也能满足大型项目的安装和发布
安装
下载地址:https://github.com/pypa/setuptools
使用
创建一个目录和setup.py文件
mkdir demo cd demo vim setup.py #coding:utf8 from setuptools import setup setup( name='MyApp', # 应用名 version='1.0', # 版本号 packages=['myapp'] # 包括在安装包内的Python包 )
有了setup.py就可以打各种包,也可以部署到本地环境中
创建egg包
python setup.py bdist_egg
该命令会在当前目录下创建“dist”及“build”目录及egg-info文件
创建tar.gz包
python setup.py sdist --formats=gztar
该命令在“dist”目录创建tar包
安装应用
python setup.py install
会安装到Python环境的“site-packages”目录下
开发方式安装
python setup.py develop
如果应用在开发过程中会频繁变更,每次安装还需要先卸载原来的版本,很麻烦,使用develop开发方式安装的话,应用代码不会真的被拷贝到本地site-packages目录下,而是在site-packages目录下创建一个指向当前应用位置的链接,这样当前位置源码改动就会马上生效。
引入非Python文件
如何打包静态文件如:css、js、图片等,这时我们要在项目下添加MANIFEST.in的文件。如下:
demo/ ├ setup.py # 安装文件 ├ MANIFEST.in # 清单文件 └ myapp/ # 源代码 ├ static/ # 静态文件目录 ├ __init__.py ...
我们在清单文件“MANIFEST.in”中,列出想要在包内引入的目录路径
recursive-include myapp/static * recursive-include myapp/xxx *
然后在setup.py中将"include_package_data"参数设置为True
from setuptools import setup setup( name='demo', # 应用名 version='1.0', # 版本号 packages=['myapp'], # 包括在安装包内的Python包 include_package_data=True # 启用清单文件MANIFEST.in )
自动安装依赖
from setuptools import setup setup( name='demo', # 应用名 version='1.0', # 版本号 packages=find_packages(),# 包括在安装包内的Python包 #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=[ # 依赖包下载路径 'http://example.com/dependency.tar.gz' ] )
补充
官方文档:https://setuptools.readthedocs.io/en/latest/