python的构建工具setup.py的方法使用示例


Posted in Python onOctober 23, 2017

本文介绍了python的构建工具setup.py,分享个大家,具体如下:

一、构建工具setup.py的应用场景

在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“python setup.py install”,前者是在线安装,会安装该包的相关依赖包;后者是下载源码包然后在本地安装,不会安装该包的相关依赖包。所以在安装普通的python包时,利用pip工具相当简单。但是在如下场景下,使用python setup.py install会更适合需求:

在编写相关系统时,python 如何实现连同依赖包一起打包发布?

假如我在本机开发一个程序,需要用到python的redis、mysql模块以及自己编写的redis_run.py模块。我怎么实现在服务器上去发布该系统,如何实现依赖模块和自己编写的模块redis_run.py一起打包,实现一键安装呢?同时将自己编写的redis_run.py模块以exe文件格式安装到python的全局执行路径C:\Python27\Scripts下呢?

在这种应用场景下,pip工具似乎派不上了用场,只能使用python的构建工具setup.py了,使用此构建工具可以实现上述应用场景需求,只需在 setup.py 文件中写明依赖的库和版本,然后到目标机器上使用python setup.py install安装。

二、setup.py介绍

from setuptools import setup, find_packages 
 
setup( 
 name = "test", 
 version = "1.0", 
 keywords = ("test", "xxx"), 
 description = "eds sdk", 
 long_description = "eds sdk for python", 
 license = "MIT Licence", 
 
 url = "http://test.com", 
 author = "test", 
 author_email = "test@gmail.com", 
 
 packages = find_packages(), 
 include_package_data = True, 
 platforms = "any", 
 install_requires = [], 
 
 scripts = [], 
 entry_points = { 
  'console_scripts': [ 
   'test = test.help:main' 
  ] 
 } 
)

 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中: console_scripts 指明了命令行工具的名称;在“redis_run = RedisRun.redis_run:main”中,等号前面指明了工具包的名称,等号后面的内容指明了程序的入口地址。

entry_points={'console_scripts': [
   'redis_run = RedisRun.redis_run:main',
 ]}

这里可以有多条记录,这样一个项目就可以制作多个命令行工具了,比如:

setup(
 entry_points = {
  'console_scripts': [
   'foo = demo:test',
   'bar = demo:test',
  ]}
)

三、setup.py的项目示例代码

#!/usr/bin/env python
# coding=utf-8

from setuptools import setup

'''
把redis服务打包成C:\Python27\Scripts下的exe文件
'''

setup(
 name="RedisRun", #pypi中的名称,pip或者easy_install安装时使用的名称,或生成egg文件的名称
 version="1.0",
 author="Andreas Schroeder",
 author_email="andreas@drqueue.org",
 description=("This is a service of redis subscripe"),
 license="GPLv3",
 keywords="redis subscripe",
 url="https://ssl.xxx.org/redmine/projects/RedisRun",
 packages=['RedisRun'], # 需要打包的目录列表

 # 需要安装的依赖
 install_requires=[
  'redis>=2.10.5',
  'setuptools>=16.0',
 ],

 # 添加这个选项,在windows下Python目录的scripts下生成exe文件
 # 注意:模块与函数之间是冒号:
 entry_points={'console_scripts': [
  'redis_run = RedisRun.redis_run:main',
 ]},

 # long_description=read('README.md'),
 classifiers=[ # 程序的所属分类列表
  "Development Status :: 3 - Alpha",
  "Topic :: Utilities",
  "License :: OSI Approved :: GNU General Public License (GPL)",
 ],
 # 此项需要,否则卸载时报windows error
 zip_safe=False
)

四、修改后的项目代码(此时RedisRun模块是DrQueue模块的子模块,这是因为要导入某些公用的模块)

#!/usr/bin/env python
# coding=utf-8

from setuptools import setup

'''
把redis服务打包成C:\Python27\Scripts下的exe文件
'''

setup(
 name="RedisRun", #pypi中的名称,pip或者easy_install安装时使用的名称
 version="1.0",
 author="Andreas Schroeder",
 author_email="andreas@drqueue.org",
 description=("This is a service of redis subscripe"),
 license="GPLv3",
 keywords="redis subscripe",
 url="https://ssl.xxx.org/redmine/projects/RedisRun",
 packages=['DrQueue'], # 需要打包的目录列表

 # 需要安装的依赖
 install_requires=[
  'redis>=2.10.5',
 ],

 # 添加这个选项,在windows下Python目录的scripts下生成exe文件
 # 注意:模块与函数之间是冒号:
 entry_points={'console_scripts': [
  'redis_run = DrQueue.RedisRun.redis_run:main',
 ]},

 # long_description=read('README.md'),
 classifiers=[ # 程序的所属分类列表
  "Development Status :: 3 - Alpha",
  "Topic :: Utilities",
  "License :: OSI Approved :: GNU General Public License (GPL)",
 ],
 # 此项需要,否则卸载时报windows error
 zip_safe=False
)

 此时项目的目录结构为:

python的构建工具setup.py的方法使用示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python os.path模块常用方法实例详解
Sep 16 Python
详解python之heapq模块及排序操作
Apr 04 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
python3图片文件批量重命名处理
Oct 31 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
python如何实现word批量转HTML
Sep 30 Python
利用Python网络爬虫爬取各大音乐评论的代码
Apr 13 Python
python使用pyqt写带界面工具的示例代码
Oct 23 #Python
基于Django的python验证码(实例讲解)
Oct 23 #Python
itchat接口使用示例
Oct 23 #Python
python实现微信接口(itchat)详细介绍
Oct 23 #Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 #Python
Python 模拟员工信息数据库操作的实例
Oct 23 #Python
Scrapy爬虫实例讲解_校花网
Oct 23 #Python
You might like
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
js比较日期大小的方法
2015/05/12 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
vue生命周期实例小结
2018/08/15 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
Python paramiko模块的使用示例
2018/04/11 Python
python 调试冷知识(小结)
2019/11/11 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
环境科学专业研究生求职信
2013/10/02 职场文书
采购部岗位职责
2013/11/24 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Mysql 设置boolean类型的操作
2021/06/04 MySQL