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列表推导式的使用方法
Nov 21 Python
python多线程编程中的join函数使用心得
Sep 02 Python
Python中pygame安装方法图文详解
Nov 11 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
基于Python函数和变量名解析
Jul 19 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
图文详解matlab原始处理图像几何变换
Jul 09 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
解析link_mysql的php版
2013/06/30 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
测绘工程本科生求职信
2013/10/10 职场文书
白酒市场营销方案
2014/02/25 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android