什么事setuptools
setuptools是Python distutils增强版的集合,它可以帮助我们更简单的创建和分发Python包,尤其是拥有依赖关系的。setuptools可以说相当的简单易用,它会随着Python一起安装,你只需要写一个简短的setup.py文件就可以将你的Python应用打包。
功能亮点
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/