怎样将python3 程序打包程序及其依赖打包成rpm包部署

用户名:aaron428
文章数:109
访问量:97480
注册日期:
阅读量:1297
阅读量:3317
阅读量:461362
阅读量:1145760
51CTO推荐博文
一.RPM制作步骤我们在企业中有的软件基本都是编译的,我们每次安装都得编译,那怎么办呢?那就根据我们的需求制作RPM安装包吧。先来说说基本布骤:1.Planning what you want & & & & & & 计划做什么rpm包。软件的?库的?2.Gathering the software to package &收集原材料,即收集源码包3.Patch the software as need & & & & 如果需要打补丁,收集补丁文件。此布骤不是必须4.Outling any dependenies& & &确定依赖关系包------------------ &上述动作可由我们手动编译一次软件来确定 &-------------------5.Building RPMs & & & & & & & & & & &开始动手制作RPM包5.1 Set up the directory stucture 设定好目录结构,我们在这些目录中制作我们的RPM包,我们需要下列目录BUILD源代码解压后的存放目录RPMS & &制作完成后的RPM包存放目录,里面有与平台相关的子目录SOURCES 收集的源材料,补丁的存放位置SPECS & SPEC文件存放目录SRMPS & 存放SRMPS生成的目录5.2 Place the Sources in the right directory & 把源材料放到正确的位置5.3 Create a spec file that tell rpmbuild command what to do 创建spec文件,这是纲领文件,rpmbuild命令根据spec文件来制作合适的rpm包5.4 Build the source and binary RPMS 制作src或二进制rpm包6.Test RPMS 测试制作的PRM包7.Add signature for RPM &为RPM包签名二.RPM包制作实例我还是用连贯的话为大家叙述一遍吧,我们首先确实我们要为什么做rpm包,通常我们是为一些软件,比如httpd,nginx等,然后去收集这些软件包的源代码,如果有需要的话也收集这些补丁文件,手动编译安装一下这个软件(当然如果是不需要编译的就不用演练了),确定依赖的软件包,并记录下来,下面开始准备制作tengine的PRM包吧:1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果useradd&ibuler
su&-&ibuler2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles &查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间&rpmbuild&--showrc&|&grep&topdir
-14:&_builddir&&%{_topdir}/BUILD
-14:&_buildrootdir&%{_topdir}/BUILDROOT
-14:&_rpmdir&&&&%{_topdir}/RPMS
-14:&_sourcedir&%{_topdir}/SOURCES
-14:&_specdir&&&%{_topdir}/SPECS
-14:&_srcrpmdir&%{_topdir}/SRPMS
-14:&_topdir&&&&%{getenv:HOME}/rpmbuild我们还是自定义工作目录(或车间)吧vi&~/.rpmmacros&%_topdir
/home/ibuler/rpmbuild&&&&##目录可以自定义&&mkdir&~/rpmbuild3.在topdir下建立需要的目录cd&~/rpmbuild
mkdir&-pv&{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}4.把收集的源码放到SOURCES下cp&/tmp/tengine-1.4.2.tar.gz&SOURCES&&&##事先放好的5.在SPECS下建立重要的spec文件cd&SPECS&vi&tengine.spec&&&&&&&&&&##内容见后讲解,rhel6.3会自动生成模板6.用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包&rpmbuild
-ba&既生成src.rpm又生成二进制rpm
-bs&只生成src的rpm
-bb&只生二进制的rpm
-bp&执行到pre
-bc&执行到&build段
-bi&执行install段
-bl&检测有文件没包含我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题root用户测试安装:cd&/tmpcp&/home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm&/tmp
rpm&-ivh&tengine-1.4.2-1.el6.x86_64.rpm&&##测试安装
rpm&-e&tengine&&&&&&&&&&&&&&&&&&&&&&&&&&&##测试卸载,如果版本号比原来的高,升级测试8.如果没问题为rpm包签名吧,防止有人恶意更改 & &##这个先不写了,有点晚了,以后补上到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的vi&tengine.spec&
###&0.define&section&&&&&&&&&&&&&&&#自定义宏段,这个不是必须的&
###&%define&nginx_user&nginx&&&&&&&#这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用&
###&1.The&introduction&section&&&&&&#介绍区域段&
Name:&&&&&&&&&&&tengine&&&&&&&&&&&&#名字为tar包的名字&
Version:&&&&&&&&1.4.2&&&&&&&&&&&&&&#版本号,一定要与tar包的一致哦&
Release:&&&&&&&&1%{?dist}&&&&&&&&&&#释出号,也就是第几次制作rpm&
Summary:&&&&&&&&tengine&from&TaoBao&&#软件包简介,最好不要超过50字符&
Group:&&&&&&&&&&System&Environment/Daemons&&#组名,可以通过less&/usr/share/doc/rpm-4.8.0/GROUPS&选择合适组&
License:&&&&&&&&GPLv2&&&&&&&&&&&&&&&&&&&&&&&#许可,GPL还是BSD等&&
URL:&&&&&&&&&&&&http://laoguang.&&&#可以写一个网址&
Packager:&&&&&&&Laoguang&&&&
Vendor:&&&&&&&&&&
Source0:&&&&&&&&%{name}-%{version}.tar.gz&&&
#定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用&
#patch0:&&&&&&&&&&&&a.patch&&&&&&&&&&&&&&&&&#如果需要补丁,依次写&
BuildRoot:&&&&&&%_topdir/BUILDROOT&&&&&&&&&
#这个是软件make&install&的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
#我们可以来观察生成了哪此文件,方便写file区域&
BuildRequires:&&gcc,make&&&&&&&&&&&&&&&&&&&&&&&&&&&#制作过程中用到的软件包&
Requires:&&&&&&&pcre,pcre-devel,openssl,chkconfig&&#软件运行需要的软件包,也可以指定最低版本如&bash&&=&1.1.1&
%description&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#软件包描述,尽情的写吧&
It&is&a&Nginx&from&Taobao.&&&&&&&&&&&&&&&&&&&&&&&&&#描述内容&
###&&2.The&Prep&section&准备阶段,主要目的解压source并cd进去&
%prep&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#这个宏开始&
%setup&-q&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#这个宏的作用静默模式解压并cd&
#%patch0&-p1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#如果需要在这打补丁,依次写&
###&&3.The&Build&Section&编译制作阶段,主要目的就是编译&
./configure&\&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#./configure&也可以用%configure来替换&
&&--prefix=/usr&\&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#下面的我想大家都很熟悉&
&&--sbin-path=/usr/sbin/nginx&\&
&&--conf-path=/etc/nginx/nginx.conf&\&
&&--error-log-path=/var/log/nginx/error.log&\&
&&--http-log-path=/var/log/nginx/access.log&\&
&&--pid-path=/var/run/nginx/nginx.pid&&\&
&&--lock-path=/var/lock/nginx.lock&\&
&&--user=nginx&\&
&&--group=nginx&\&
&&--with-http_ssl_module&\&
&&--with-http_flv_module&\&
&&--with-http_stub_status_module&\&
&&--with-http_gzip_static_module&\&
&&--http-client-body-temp-path=/var/tmp/nginx/client/&\&
&&--http-proxy-temp-path=/var/tmp/nginx/proxy/&\&
&&--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/&\&
&&--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi&\&
&&--http-scgi-temp-path=/var/tmp/nginx/scgi&\&
&&--with-pcre&
make&%{?_smp_mflags}&&&&&&&&&&#make后面的意思是:如果就多处理器的话make时并行编译&
###&&4.Install&section&&安装阶段&
%install&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rm&-rf&%{buildroot}&&&&&&&&&&&&&&&&#先删除原来的安装的,如果你不是第一次安装的话&
make&install&DESTDIR=%{buildroot}&
#DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了&
###&&4.1&scripts&section&#没必要可以不写&
%pre&&&&&&&&#rpm安装前制行的脚本&
if&[&$1&==&1&];then&&&&#$1==1&代表的是第一次安装,2代表是升级,0代表是卸载&
&&&&&&&&/usr/sbin/useradd&-r&nginx&2&&/dev/null&&##其实这个脚本写的不完整
%post&&&&&&&#安装后执行的脚本&
%preun&&&&&&#卸载前执行的脚本&
if&[&$1&==&0&];then&
&&&&&&&&/usr/sbin/userdel&-r&nginx&2&&/dev/null&
%postun&&&&&#卸载后执行的脚本&
###&&5.clean&section&清理段,删除buildroot&
rm&-rf&%{buildroot}&
###&&6.file&section&要包含的文件&
%defattr&(-,root,root,0755)&&&#设定默认权限,如果下面没有指定权限,则继承默认&
/etc/&&&&&&&&&&&#下面的内容要根据你在%{rootbuild}下生成的来写&&&&&
###&&7.chagelog&section&&改变日志段&
%changelog&
*&&Fri&Dec&29&2012&laoguang&&&&-&1.0.14-1&
-&Initial&version到此一个简单的tengine&RPM包制作好了。三.RPM包制作拓展下面我们来拓展一下,比如:我们想为tengine增加控制脚本,可以通过start|stop控制,我们还想更换一下默认的首页index.html,默认的fastcgi_params是不能直接连接php的,所以我们替换为新的配置文件,我们也可以用设置好的nginx.conf替换原来的nginx.conf。基于上述步骤下面继续1.把修改后的首页文件index.html,控制脚本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。&[ibuler@ng1&rpmbuild]$&ls&SOURCES/
fastcgi_params&&index.html&&init.nginx&&nginx.conf&&tengine-1.4.2.tar.gz2 编辑tengine.spec,修改2.1 介绍区域的SOURCE0下增加如下Source0:&&&&&&&&%{name}-%{version}.tar.gz&
Source1:&&&&&&&&index.html&
Source2:&&&&&&&&init.nginx&
Source3:&&&&&&&&fastcgi_params&
Source4:&&&&&&&&nginx.conf2.2 安装区域增加如下make&install&DESTDIR=%{buildroot}&
%{__install}&-p&-D&%{SOURCE1}&%{buildroot}/usr/html/index.html&&#%{__install}这个宏代表install命令
%{__install}&-p&-D&-m&0755&%{SOURCE2}&%{buildroot}/etc/rc.d/init.d/nginx&
%{__install}&-p&-D&%{SOURCE3}&%{buildroot}/etc/nginx/fastcgi_params&
%{__install}&-p&-D&%{SOURCE4}&%{buildroot}/etc/nginx/nginx.conf2.3 脚本区域增加如下%post&
if&[&$1&==&1&];then&
&&&&&&&&/sbin/chkconfig&--add&nginx&
fi2.4 %file区域增加如下%files&
%defattr&(-,root,root,0755)&
%config(noreplace)&/etc/nginx/nginx.conf&&&&&#%config表明这是个配置文件noplace表明不能替换
%config(noreplace)&/etc/nginx/fastcgi_params&
%doc&/usr/html/index.html&&&&&&&&&&&&&&&&&&&&#%doc表明这个是文档
%attr(0755,root,root)&/etc/rc.d/init.d/nginx&#%attr后面的是权限,属主,属组3. 生成rpm文件测试rpmbuild&-ba&tengine.spec4. 安装测试&到此RPM包制作完毕,你可以根据你的需求制作RPM包吧。四.RPM包签名1.生成GPG签名密钥,我用的是root用户gpg&--gen-key&
Your&selection?1&Enter&&&&&&&&&&&&&&&&&&&&&&&&##默认即可
What&keysize&do&you&want?&(&Enter&&&##密钥长度
Key&is&valid&for?&(0)&1y&Enter&&&##有效期
Is&this&correct?&(y/N)&y&Enter&&&##确认
Real&name:&LaoGuang&Enter&&&&&&&&##密钥名称
Email&address:&&Enter&&&##邮件
Comment:&GPG-RPM-KEY&Enter&&&&&&&##备注
Change&(N)ame,&(C)omment,&(E)mail&or&(O)kay/(Q)uit?&O&ENTER&&
Enter&passphrase&&OK&&Enter&&&&&&##使用空密码,也可以输入&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&Take&this&one&anyway&&&Enter&&
&Take&this&one&anyway&&&Enter&有时可能因为随机数不够导致卡在那里,这时候你就yum 安装几个包组,马上就够了。2.查看成生的密钥[root@ng1&dev]#&gpg&--list-keys&
/root/.gnupg/pubring.gpg&
------------------------&
pub&&&88&&[expires:&]&
uid&&&&&&&&&&&&&&&&&&LaoGuang&(GPG-RPM-KEY)&&&&
sub&&&9D&&[expires:&]3.导出公钥以供大家使用验证gpg&--export&-a&"LaoGuang"&&&RPM-GPG-KEY-LaoGuang4.编缉 .rpmmacros说明我们用哪一个密钥加密,我们用root加密的那就在/root下编辑vi&~/.rpmmacros
%_gpg_name&LaoGuang5.为rpm包加签名&rpm&--addsign&tengine-1.4.2-1.el6.x86_64.rpm&&
Enter&pass&phrase:&&&&&&&##输入密钥
Pass&phrase&is&good.&
tengine-1.4.2-1.el6.x86_64.rpm:到此签名添加成功,下面来验证6.讲刚才导出的公钥导入rpm中rpm&--import&RPM-GPG-KEY-LaoGuang7.验证rpm&--checksig&tengine-1.4.2-1.el6.x86_64.rpm
tengine-1.4.2-1.el6.x86_64.rpm:&rsa&sha1&(md5)&pgp&md5&OK到此整个过程完毕,你也试试吧
了这篇文章
类别:┆阅读(0)┆评论(0)怎样将python程序及其依赖打包成rpm包部署? - 知乎31被浏览2923分享邀请回答0添加评论分享收藏感谢收起Python脚本文件打包成可执行文件的方法
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python脚本文件打包成可执行文件的方法,本主要讲解了Python2.X版本的打包方法,对Python3.X的打包也有简单介绍,需要的朋友可以参考下
将Python脚本文件包装成可执行文件,其目的有二:
一则: 不需要依赖Python编译器就可以运行软件
二则: 不想让自己的源码公布出去
常用的工具有: py2exe、cx_freeze等
【工具:py2exe】
安装py2exe
安装该工具很简单:
只需要从官方网站:http://www.py2exe.org/下载与版本对应的安装程序,点击下一步即可完成安装。
安装后,执行import py2exe,不报错则表示安装成功!
&&& import py2exe&
NOTE: 目前该工具只支持到Python2.7, 对于Python3而言,必须借助另外一个工具:cx_freeze
使用py2exe
第一步: 准备源代码,假如名为:Hello.py
第二步: 准备编译脚本,假如名为:setup.py
from distutils.core import setup&
import py2exe&
setup(windows=['Hello.py'])&
第三步: 运行命令: setup.py py2exe
D:\temp&setup.py py2exe
运行之后,会在我当前运行的目录下(D:\temp)默认生成dict目录,里面的文件如下:
默认情况下,py2exe在目录dist下创建以下这些必须的文件:&
1、一个或多个exe文件。如本例为: Hello.exe&
2、python##.dll。 如本例中: Python27.dll&
3、.pyd文件,它们是已编译的扩展名,它们是exe文件所需要的;加上其它的.dll文件,这些.dll是.pyd所需要的。&
4、一个library.zip文件,它包含了已编译的纯的python模块如.pyc或.pyo&
第四步: 双击Hello.exe可执行文件,跟源代码运行后同样的结果:
1: 执行setup.py --help获取帮助信息
Global options:&
& --verbose (-v)& run verbosely (default)&
& --quiet (-q)&&& run quietly (turns verbosity off)&
& --dry-run (-n)& don't actually do anything&
& --help (-h)&&&& show detailed help message&
& --no-user-cfg&& ignore pydistutils.cfg in your home directory&
Options for 'py2exe' command:&
& --optimize (-O)&&&&&& optimization level: -O1 for "python -O", -O2 for&
&&&&&&&&&&&&&&&&&&&&&&& "python -OO", and -O0 to disable [default: -O0]&
& --dist-dir (-d)&&&&&& directory to put final built distributions in (default&
&&&&&&&&&&&&&&&&&&&&&&& is dist)&
& --excludes (-e)&&&&&& comma-separated list of modules to exclude&
& --dll-excludes&&&&&&& comma-separated list of DLLs to exclude&
& --ignores&&&&&&&&&&&& comma-separated list of modules to ignore if they are&
&&&&&&&&&&&&&&&&&&&&&&& not found&
& --includes (-i)&&&&&& comma-separated list of modules to include&
& --packages (-p)&&&&&& comma-separated list of packages to include&
& --compressed (-c)&&&& create a compressed zipfile&
& --xref (-x)&&&&&&&&&& create and show a module cross reference&
& --bundle-files (-b)&& bundle dlls in the zipfile or the exe. Valid levels&
&&&&&&&&&&&&&&&&&&&&&&& are 1, 2, or 3 (default)&
& --skip-archive&&&&&&& do not place Python bytecode files in an archive, put&
&&&&&&&&&&&&&&&&&&&&&&& them directly in the file system&
& --ascii (-a)&&&&&&&&& do not automatically include encodings and codecs&
& --custom-boot-script& Python file that will be run when setting up the&
&&&&&&&&&&&&&&&&&&&&&&& runtime environment&
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]&
&& or: setup.py --help [cmd1 cmd2 ...]&
&& or: setup.py --help-commands&
&& or: setup.py cmd --help&
2: 一个详细的编译脚本
# -*- coding: cp936 -*-&
from distutils.core import setup&
import py2exe&
includes = ["encodings", "encodings.*"]&
options = {"py2exe":&&&
&&&&&&&&&&& {"compressed": 1,&&&&& # 压缩&&&
&&&&&&&&&&&& "optimize": 2,&&&&&&& # 优化级别&
&&&&&&&&&&&& "ascii": 1,&&&&&&&&&& #&&
&&&&&&&&&&&& "includes":includes,& # 编码方式&
&&&&&&&&&&&& "bundle_files": 1&&&& # 所有文件打包成一个zipfile或exe文件,有效级别1,2,3&
&&&&&&&&&&& }}&
&&& options=options,&&&&&&&&&&&&&& # 是否需要可选项,默认为None&
&&& zipfile=None,&&&&&&&&&&&&&&&&& # 是否需要压缩像,默认为None&
&&& console=[{"script": "HelloCmd.py", "icon_resources": [(1, "pc.ico")]}], # 针对CMD控制端口&&
&&& windows=[{"script": "HelloWin.py", "icon_resources": [(1, "pc.ico")]}], # 针对GUI图形窗口&
&&& data_files=[("magic",["App_x86.exe",]),],&
&&& version = "v1.01",&&&&&&&&&&&& # 版本信息&
&&& description = "py2exe testing",# 描述信息&&
&&& name = "Hello, Py2exe",&&&&&&& # 名字信息&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 python程序打包发布 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信