前言
这两天封装了一个异常点检测的工具,并且需要把它部署到一个新环境中。为了方便使用,我想到编写 setup.py 打包/安装我的 python 程序。
简单来说,之前我是这样使用我的 python 程序:
python outliers.py -h
现在我希望能直接在命令行中使用:
outliers -h
这个效果可以在 python setup.py install 安装之后做到。
setup.py 和 pip 安装包的区别
在安装python的相关模块和库时,我们一般使用“pip install 模块名”或者“python setup.py install”,前者是在线安装,会安装该包的相关依赖包;后者是下载源码包然后在本地安装,不会安装该包的相关依赖包。所以在安装普通的python包时,利用pip工具相当简单。但是在一些场景中,使用 python setup.py install 会更适合需求。
setup.py 介绍
setup.py 是一种构建工具,可以帮助你打包/安装 python 程序。
setup.py 参数介绍:
--name 包名称
--version (-V) 包版本
--author 程序的作者
--author_email 程序的作者的邮箱地址
--maintainer 维护者
--maintainer_email 维护者的邮箱地址
--url 程序的官网地址
--license 程序的授权信息
--description 程序的简单描述
--long_description 程序的详细描述
--platforms 程序适用的软件平台列表
--classifiers 程序的所属分类列表
--keywords 程序的关键字列表
--packages 需要处理的包目录(包含__init__.py的文件夹)
--py_modules 需要打包的python文件列表
--download_url 程序的下载地址
--cmdclass
--data_files 打包时需要打包的数据文件,如图片,配置文件等
--scripts 安装时需要执行的脚步列表
--package_dir 告诉setuptools哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {'': 'lib'},表示“root package”中的模块都在lib 目录中。
--requires 定义依赖哪些模块
--provides定义可以为哪些模块提供依赖
--find_packages() 对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有 __init__.py的包。
其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包
find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])
--install_requires = ["requests"] 需要安装的依赖包
--entry_points 动态发现服务和插件,可以指定命令行运行
其中 entry_points 是关键,可以通过设置它来 安装 python 程序到命令行运行。
在项目中编写 setup.py
下面介绍在我的项目中是如何编写 setup.py 的。
我的项目结构很简单,目录如下:
.
├── config.ini
├── data.csv
├── download_pkgs.sh
├── install.sh
├── outliers.py
└── README.md
其中主程序文件只有 outliers.py。
outliers.py 文件内容大致如下:
#coding=utf8
import ...
class Outliers:
...
def main():
...
if __name__ == '__main__':
main()
下面是我编写 setup.py 文件:
#coding=utf8
from setuptools import setup
import outliers
setup(
name = 'outliers',
version = '0.1.0',
keywords = ('outliers', 'detect'),
description = 'A outliers detect tool.',
license = 'MIT licence',
url = 'https://github.com/elliotxx/outliers',
author = 'ElliotXX',
author_email = 'yiyu2017@qq.com',
py_modules = ['outliers'],
platforms = 'any',
install_requires = [
'numpy>=1.14.5',
'six>=1.5',
'python-dateutil>=2',
'pytz>=2011k',
'pandas>=0.22.0',
'SciPy>= 0.13.3',
'scikit-learn>=0.19.2',
],
entry_points = {
'console_scripts' : [
# 这一行是安装到命令行运行的关键
'outliers = outliers:main'
]
}
)
setup.py 编写好之后放到项目目录中,和 outliers.py 同级。
然后运行以下代码安装 outliers.py:
python setup.py build
python setup.py install
安装成功后,便可以在命令行中直接运行程序:
D:\workspace\outliers>outliers
Reading `data.csv`...
[ERROR] File `data.csv` is not provided
[INFO] You can enter `outliers -h` to see help
D:\workspace\outliers>outliers -i input.csv -o output.csv
Reading `input.csv`...
Data preprocessing...
Model training...
Outliers predicting...
Writing `output.csv`...
参考资料
python的构建工具setup.py
python的setup问题(比较详细)
使用 Setup 将Python 代码 打包
Python 打包,entry_points的使用
python setup.py uninstall - stackoverflow
https://stackoverflow.com/questions/1550226/python-setup-py-uninstall