windows、linux下打包Python3程序详细方法


Posted in Python onMarch 17, 2020

最近项目中需要Python的打包,看到网上也没有很详细的资料,于是做了一些示例程序。研究了一下,Python如何在Windows和Linux上打包

背景

Python版本:3.6.

Windows版本:Windows 10 家庭中文版 64-bit (10.0, Build 18362) (18362.19h1_release.190318-1202)

Linux版本:centos7.

Python打包工具

今天没时间研究cx_Freeze,先研究了一下PyInstaller。

py2exe

py2exe是一个将python转换成windows上的可独立执行的可执行程序(*.exe)的工具。不过,该可执行程序,只能在相同的Windows系统下运行,而且不适合Linux。果断被我舍弃不在研究了。

cx_Freeze

cx_Freeze 是一个类似 py2exe 的工具,但 cx_Freeze 可以在 linux 下可以直接执行的 ELF 格式的二进制可执行文件,也可以在windows上执行。

cx_Freeze的作用可以让python程序可以脱离python运行环境,在没有安装python的微型linux系统(例如cdlinux、tinycore等)里,方便地运行你的python程序。

程序简介:https://pypi.org/project/cx-Freeze/5.0/

PyInstaller

号称是目前最全面的打包程序,然后我看了一下程序更新时间。一看是10天前,嗯,不错,就它了。

程序简介:https://pypi.org/project/PyInstaller/

看了一下参数介绍如下:

windows、linux下打包Python3程序详细方法

Windows打包Python程序实例

1、单个文件打包

核心源码

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2020-1-20
Info: Python打包示例1,单个文件打包
 “pyinstaller -F(单个可执行文件) 程序源 -n 程序名 -w(去掉控制台窗口,这在GUI界面时非常有用) -i 图标.ico”
 “pyinstaller -F test1/Demo_Test1_Python.py”
"""
def bubble_sort(arr):
 """
 冒泡排序
 :param arr:
 :return:
 """
 for i in range(1, len(arr)):
  for j in range(0, len(arr)-i):
   if arr[j] > arr[j+1]:
    arr[j], arr[j + 1] = arr[j + 1], arr[j]
 return arr
if __name__ == '__main__':
 test = [1, 8, 123, 18, 99, 300]
 print("************************************")
 print("*    冒泡排序    *")
 print("************************************")
 print("源列表:", test)
 result = bubble_sort(test)
 print("排序后:", result)
 print("************************************")
 input("按任意键退出...")

程序运行

windows、linux下打包Python3程序详细方法

打包方法

pyinstaller -F test1/Demo_Test1_Python.py

打包后效果

windows、linux下打包Python3程序详细方法

多个文件打包

核心源码

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2020-1-20
Info: Python打包示例2,多个文件打包
 “pyinstaller -F(单个可执行文件) 程序源 -n 程序名 -w(去掉控制台窗口,这在GUI界面时非常有用) -i 图标.ico”
 “pyinstaller -F test2/Demo_Test2_Python.py”
"""
from test2.Demo_bubble_sort import bubble_sort
from test2.Demo_heap_sort import heap_sort
if __name__ == '__main__':
 test1 = [1, 8, 123, 18, 99, 300]
 test2 = test1[:]
 print("************************************")
 print("*    两个排序    *")
 print("************************************")
 print("列表1 id:", id(test1))
 print("列表2 id:", id(test2))
 print("源列表1:", test1)
 print("源列表2:", test2)
 result1 = bubble_sort(test1)
 result2 = heap_sort(test1)
 print("冒泡后:", result1)
 print("堆排后:", result2)
 print("************************************")
 input("按任意键退出...")

程序运行

windows、linux下打包Python3程序详细方法

打包命令

pyinstaller -F test2/Demo_Test2_Python.py

打包后效果

windows、linux下打包Python3程序详细方法

多层文件打包

核心源码

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2020-1-20
Info: Python打包示例3,多层文件打包
 “pyinstaller -F(单个可执行文件) 程序源 -n 程序名 -w(去掉控制台窗口,这在GUI界面时非常有用) -i 图标.ico”
 “pyinstaller -F test3/Demo_Test3_Python.py”
"""
from test3.sort.Demo_bubble_sort import bubble_sort
from test3.sort.Demo_heap_sort import heap_sort
from test3.Demo_test import Test
if __name__ == '__main__':
 test1 = [1, 8, 123, 18, 99, 300]
 test2 = test1[:]
 print("************************************")
 print("*    两个排序    *")
 print("************************************")
 print("列表1 id:", id(test1))
 print("列表2 id:", id(test2))
 print("源列表1:", test1)
 print("源列表2:", test2)
 result1 = bubble_sort(test1)
 result2 = heap_sort(test1)
 print("冒泡后:", result1)
 print("堆排后:", result2)
 Test.run()
 print("************************************")
 input("按任意键退出...")

程序运行

windows、linux下打包Python3程序详细方法

打包命令

pyinstaller -F test4/Demo_Test4_Python.py -n Test4 -i test4/test4.ico

打包后效果

windows、linux下打包Python3程序详细方法

Python Linux打包实例

多层文件打包

核心源码

#! -*- coding: utf-8 -*-
"""
Author: ZhenYuSha
Create Time: 2020-1-20
Info: Python打包示例5,多层文件打包修改程序名 linux打包
 “pyinstaller -F(单个可执行文件) 程序源 -n 程序名 -w(去掉控制台窗口,这在GUI界面时非常有用) -i 图标.ico”
 “-p 表示自定义需要加载的类路径(一般情况下用不到)”
 “pyinstaller -F Demo_Test5_Python.py -n Test5”
"""
from sort.Demo_bubble_sort import bubble_sort
from sort.Demo_heap_sort import heap_sort
from Demo_test import Test
if __name__ == '__main__':
 test1 = [1, 8, 123, 18, 99, 300]
 test2 = test1[:]
 print("************************************")
 print("*    两个排序    *")
 print("************************************")
 print("列表1 id:", id(test1))
 print("列表2 id:", id(test2))
 print("源列表1:", test1)
 print("源列表2:", test2)
 result1 = bubble_sort(test1)
 result2 = heap_sort(test1)
 print("冒泡后:", result1)
 print("堆排后:", result2)
 Test.run()
 print("************************************")
 input("按任意键退出...")

程序运行

windows、linux下打包Python3程序详细方法

打包后效果

windows、linux下打包Python3程序详细方法

遇到的错误,以及解决方案

错误1(找不到pyinstaller)

我是用 pip install 安装的pyinstaller,于是先find了一下,找到了此命令,于是就做了个软链接。

解决方案,直接将安装目录下面的pyinstaller包作为软链接到/usr/bin下

ln -s /usr/local/python3.6.8/bin/pyinstaller /usr/bin/pyinstaller3.

错误2(rebuild your Python with --enable-shared)

windows、linux下打包Python3程序详细方法

这种错误,人家已经把解决方案说出来了,就是需要重新编译嘛,那我们就按照他的来就OK了。先找到源码按照的目录,并按照以下命令操作。

./configure --prefix=/usr/local/python3.6.8(需要安装的目录) --enable-shared --with-ssl
make
make install

错误3(找不到 libpython3.6m.so.1.0)

解决方案,在安装目录找到此文件,并拷贝到/usr/lib64目录下:

本文主要讲解了如何在windows与linux下打包Python3程序的详细方法,更多关于打包Python程序的知识请查看下面的相关链接

Python 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
python实现发送和获取手机短信验证码
Jan 15 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
python实现Floyd算法
Jan 03 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
python如何从文件读取数据及解析
Sep 19 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
python 爬取华为应用市场评论
May 29 Python
Python任务自动化工具tox使用教程
Mar 17 #Python
vue常用指令代码实例总结
Mar 16 #Python
django-利用session机制实现唯一登录的例子
Mar 16 #Python
python安装dlib库报错问题及解决方法
Mar 16 #Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 #Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 #Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 #Python
You might like
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PDO::getAttribute讲解
2019/01/28 PHP
js 对象是否存在判断
2009/07/15 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python实现图片文件批量重命名
2020/03/23 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
python生成word合同的实例方法
2021/01/12 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
求职信名称怎么写
2014/05/26 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
2015年保卫科工作总结
2015/05/14 职场文书