有时,Python发布的程序需要被打包为一个文件夹、甚至一个文件发布。目前(2020)最佳的策略是使用pyinstaller。

pyinstaller不仅支持打包整个运行环境到一个可执行文件,而且还支持加密。但唯一的问题是,必须依赖外部的libc.so。这衍生出了两个问题:

  1. 必须基于较低版本的Linux发行版进行打包

因为libc.so向后兼容、向前不兼容(低版本兼容高版本,而高版本不兼容低版本)。比如,在Debian Stretch打包的可执行文件,不仅在Debian Buster上可以运行,在Ubuntu的16、18、20,CentOS的7、8等都能正常运行。但是,如果是在Debian Buster上打包,那么就只有Ubuntu 20能运行了。

2.不支持Alpine等发行版

因为Alpine的libc.so约定与普通不同的发行版。Alpine是找/lib/libc.musl-x86_64.so.1,其它主流发行版都是找/lib/x86_64-linux-gnu/libc.so.6

两个问题在pyinstaller中都无法解决,只能规避。

因此,pyinstaller仍然无法帮助Python获得像Golang、Rust那样完美的打包效果,但也算比较接近了。

安装

在具备基本的Python环境后,安装Python包都是很简单的。

pip install pyinstaller

CLI

新增一个任意脚本文件,名称最好和任何已知包名不同,比如cli.py。其中只需要简单调用一下要打包的CLI入口,就可以利用pyinstaller自动完成依赖查找和打包。

"""The pyinstaller CLI entry file."""
from foo.__main__ import mainif __name__ == '__main__':main()

其它类型的Python程序,也可使用类似的方式编写打包入口。

加密

pip install pyinstaller[encryption]

安装时添加额外依赖,运行时添加一个--key=...即可实现加密。key值是一个16字符的字符串,可以通过openssl来生成。

openssl rand -base64 16 | cut -c1-16

完整打包命令

python -OO -m PyInstaller -F cli.py --name foo \--key=`openssl rand -base64 16 | cut -c1-16`

这里没有使用pyinstaller,而是使用python \-m PyInstaller,是为了进行-OO的优化。

Dockerfile示例

以下是一个Dockerfile打包示例。

FROM python:3.7-stretch as builderWORKDIR /opt/code
COPY . /opt/code/
RUN pip install --no-cache-dir pyinstaller \&& pip install -e . \&& python -OO -m PyInstaller -F cli.py --name foo \--key=`openssl rand -base64 16 | cut -c1-16`FROM debian:buster-slimENTRYPOINT ["foo"]
COPY --from=builder /opt/code/dist/foo /usr/bin/

为了兼容,这里使用了Debian Stretch版本的官方Python镜像,执行打包操作。而运行时,不仅可以用Debian的Buster版本,也可使用Ubuntu、CentOS等主流发行版的主要版本。而且,运行环境中不需要包含Python。

利用pyinstaller打包Python程序为一个可执行文件相关推荐

  1. python打包成exe fail to ex_“failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误...

    在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...

  2. pyinstaller打包python程序的常见问题

    使用pyinstaller打包python程序时遇到的问题记录,问题已全部解决. 解决方法详见 https://guangmujun.cn/archives/168 shapely库相关 问题: Un ...

  3. macOS pyinstaller打包python程序, subprocess无法运行

    在macos上使用pyinstaller打包python生成app, app也能启动运行, 可是在python中有用到pyside2的QThread和subprocess 经过验证, subproce ...

  4. Python 用pyinstaller打包python程序,生成的exe文件过大问题

    文章目录 1.安装 pipenv 2. 设置虚拟python 3.环境 4. 查看已有的库(非必要) 5.安装自己的.py文件中所需要的第三方库 6.利用pyinstaller 生成.exe文件 pi ...

  5. 利用pyinstaller打包python3程序

    pyInstaller是一款用于将pyhon程序打包成exe文件的工具,pyInstaller不是一个python的包, 只需要把pyInstaller的文件下载下来放到任意为止都可以,也就是说pyI ...

  6. 解决用pyinstaller打包python程序,生成的.exe文件过大问题

    计算机是Windows 7旗舰版  32位操作系统. Anaconda3,32bit版本 python3.7 安装完 Pyinstaller,安装Pyinstaller的命令为:pip install ...

  7. ubuntu20.10(Linux)在wine下用pyinstaller打包python程序在window系统运行 交叉编译

    1.安装wine 在终端中输入: sudo apt-get install wine 2.安装pip 在https://pypi.org/project/pip/#files下载pip-21.0.ta ...

  8. 使用pyinstaller打包python程序时问题记录

    1. 打包时出错:Module 'PyQt5' has no attribute '__version__' 我在执行打包命令时出现如下提示: 1.1 解决方案 使用conda命令重新安装pyinst ...

  9. 利用pyinstaller将python项目脚本打包成可执行文件

    利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...

最新文章

  1. c++对象模型之Data布局
  2. 将spfile从ASM里迁移到文件系统
  3. MTK:oemlock介绍
  4. Delphi 中Tform的visible属性详解
  5. xyz后缀的网站_.XYZ五岁了
  6. 计算机领域中,增量是什么意思?
  7. mysql表操作_MySQL表操作语句用法百科
  8. 控件 qml_Flat风格的Qml进度条
  9. excel中如何对矩阵得对角线进行求和_如何利用图卷积网络进行图形深度学习(第2部分)...
  10. 谷歌技术三宝之MapReduce(转)
  11. swagger ui 值类型形参加文字注释
  12. oracle怎么截取long类型,Oracle 数据库中 Long 类型字段的读取
  13. 中国精英这才是真相:我们需要信仰,我们需要思想导师
  14. 《Spring开发指南》(夏昕著)学习总结
  15. 人工智能 - 语音识别的技术原理是什么
  16. matlab读取txt函数,matlab读取txt某一行
  17. 免费 GIS 软件资源介绍,大家值得收藏
  18. 【Shading】Applying Textures 应用纹理
  19. 看门狗WATCHDOG 的复位
  20. 对已有apk进行重新签名

热门文章

  1. 如何利用LabelImg将标注文件在YOLO格式与PascalVOC格式间相互转换
  2. mysql 主从复制优化、并行复制
  3. java语言简单代码_java语言编程如何实现一个最简单程序?
  4. 郑州学python_郑州Python基础知识点学习之内置类型
  5. c语言题库杭电,C语言杭电18级B卷试题答案.doc
  6. python图片马赛克_python 检测图片是否有马赛克
  7. mysql行级锁 表级锁 页级锁详细介绍_MySQL行级锁、表级锁、页级锁详细介绍
  8. python显示1000以内的斐波拉契数列_python实现斐波那契数列
  9. numpy二维数组改变某些数_【每天15分钟,5天学会NumPy】第1天:基本概念
  10. 模板上 php dede,织梦CMS模板中dede标签使用php和if判断语句的方法