运筹优化博士,只做原创博文。更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37

最近写了几个Python的小程序给朋友使用,因为朋友完全就是一个商务运营人员,对编程语言什么的一窍不通,自然我也不可能让他安装Python编译器来运行我的源代码,并且这个小程序未来也是打算给普通用户用的,普通用户自然也没有Python运行环境。

所以我一开始是想把写好的Python代码打包成.exe给他使用,前后折腾了Pyinstaller,Py2exe 发现问题多多,打包后的.exe不是体积巨大就是各种错误。偶然间发现了 Python Release for Windows,试用之后发现部署起来方便,灵活度也比较高。因为商务人员的操作系统都是Windows x64的,我们也不需要考虑跨平台使用,这样的话 Python Release for Windows 就比 Pyinstaller 和 Py2exe 更实用一些。

那么如果你和我遇到相同的问题,你想把你的Python应用程序在本地部署,如果你想把Python应用程序转化为.exe方便给没有Python编译器的人使用的话,那么本文就是一个很好的替代方案。

1 Python Release for Windows 安装包下载

在 Python Releases for Windows 找到所需Python版本的 Windows embeddable package 下载。

我选得是Python 3.9.9 下载解压之后得到 python-3.9.9-embed-amd64 文件夹。这个文件夹里其实就是一个轻量级的免安装的Python编译器环境,压缩文件也就几十兆吧不算大。这使得我们可以 在Windows平台下 都可以运行 Python环境。

2 Python环境配置

单单有一个Python编译器环境还是不行的,因为我们的应用程序基本都需要调用很多包,而现在我们刚下载下来的这个Python编译器环境还是一片空白的,没有安装所需的包。接下来我们要把我们程序所需的包安装到这个Python编译器环境中去。其实这个过程和conda里或者正常Python里配置环境的过程基本一致。

2.1 安装 Pip

新下载的Python编译器还没有安装pip,没有pip我们安装别的包就很不方便,所以第一步我们首先安装pip。
在这个网站里下载 get-pip.py文件:https://bootstrap.pypa.io/get-pip.py,然后将 get-pip.py文件放在解压后的python-3.9.9-embed-amd64文件中,如下图所示:

在命令行中输入:python get-pip.py --no-warn-script-location
如下图所示即可完成pip的安装:

安装完成后还可以在 ./Lib/site-packages 文件夹下看到目前已经安装过的包,确认pip确实已经安装了。这个其实和正常的Python和Anaconda里是一样的。

2.2 安装其它包

pip包已经安装成功了,接下来我们可以用pip来安装其它的包。在命令行中调用如下指令,发现 Lib/site-packages 并不在我们的系统路径中。
所以接下来我们需要把 Lib/site-packages 路径添加进来,这样python才能识别出刚才安装的pip包。在文件夹下找到 python39._pth 文件并打开,此时打开后的内容为:

然后将该文件修改为如下内容并保存:
对照一下修改了2处内容,1是在第三行添加了… 2是取消了最后一行对import size的注释。修改后的文件如下所示方便大家复制。

python39.zip
.
..
# Uncomment to run site.main() automatically
import site

打开命令行,验证确实Lib/site-packages路径已经被添加进来了。
接下来就可以用pip安装你程序所需的包了,如下所示是安装pandas和numpy记住这里要把你所需的所有的包都要安装进来才能成功运行的你的代码。

3 发布程序

我们要发布的python源代码很简单,如下所示:

import pandas as pddf = pd.read_excel("./demo_data.xlsx")
print(df)

我们把如上代码存在read_excel.py中,并且把它放到python-3.9.9-embed-amd64平级的文件夹中,如下图所示:
紧接着在命令行中运行 python read_excel.py 即可在命令行中运行该代码,如下图所示:

考虑到我们的用户,可能也不太会使用命令行或者说命令行使用起来比较麻烦,我们进一步写一个.bat文件将,上面的命令行放入.bat脚本文件中帮我们执行,用户只需要双击运行.bat文件就可以运行代码了,无需在命令行中输入指令了。.bat文件内容如下所示:

cd /d %~dp0
python read_excel.py
cmd.exe

第一行:cd /d %~dp0 表示切换到当前文件运行的目录。
第二行:python read_excel.py 表示运行read_excel.py程序。
第三行:cmd.exe 表示启动命令行。
下图所示是运行.bat文件得到的结果:

可以看到运行.bat文件也可以和命令行运行相同的结果。

4 踩坑经验(已安装Anaconda环境会覆盖新环境的问题)

到上面为止其实已经完成了python的环境的部署,但是在我自己的电脑上却发现程序运行报错,错误提示显示是缺某个python的包,而我已经安装过了这个包。这个时候我发现由于我安装了Anaconda所以在命令行中python默认会选择Anaconda下的python而不会选择我新部署的python-embed环境,发现这个bug之后,我进行了三个地方的修改:
1 我将 python-embed文件夹下的 python.exe 改名为 python_embed.exe,这么做的目的就是为了区分出python关键字,因为python关键字已经被Anaconda占用了,所以我通过改名后将两个python环境区分出来。下次调用python_embed关键字就知道是我要启动新安装的python环境,而不是启动Anaconda里的python环境了。
2 将要执行的python程序和python_embed.exe放到同一个文件夹下

3 把start.bat文件夹修改为如下

cd /d %~dp0
cd python-3.9.9-embed
python_embed main.py
cmd.exe

和之前的start.bat文件比较修改了两个地方:1是加了一句 cd python-3.9.9-embed,这是因为我们要进入到子文件夹下面才能开始执行,2是把 python main.py 改为 python_embed main.py,这样就是运行我们要的python环境,而不会调用Anaconda下的python环境。

总结

总得来说我觉得 Python Release for Windows实用性还是蛮高的,Python Release for Windows的优势有以下几点:
1 哪怕你的代码调用了很多包,你只要按照你配置Anaconda或者Python环境的方式一步步就可以把环境配置到 Python Release for Windows 里。不像Pyinstaller 和 Py2exe 经常出现一些莫名其妙的问题,尤其是包调用的多了,也很难找出来问题在哪里。
2 打包后程序体积小便于他人使用,同样的代码 我用Pyinstaller 能有1个多G的大小,而Python Release for Windows也就100多M,压缩之后也就40多M。这么一小的体积就可以包括一个python环境,轻便环保便于发送。
3 Pyinstaller 生成 exe 需要很长时间,生成的过程还经常报错。相对来说 Python Release for Windows 则不存在此类问题。

参考文献:

最简单的方式发布你的Python应用 - 云+社区 - 腾讯云

【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)相关推荐

  1. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  2. 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...

    看黑马程序员Python基础班视频挺好,犹豫该不该报班? 如果看视频比较好的话,还是建议自学吧,毕竟录制视频的老师不一定参与实质的讲课,且能自学也省一笔培训费用了.我是看的bilibili上黑马程序员 ...

  3. python从入门到高阶(基于黑马程序员python教程)

    文章目录 0.文章来源 1."学it就来%s%s员"% (name,"程序员") 2.%s:占位字符串.%d:占位整型.%f:占位浮点型 3.字符串格式化的精度 ...

  4. python教材答案编写函数求成绩平均数_学好Python例题之求成绩平均分

    原博文 2019-08-16 21:03 − 例题: 用户输入若干个成绩,求所有成绩的平均值.每输入一个成绩后询问是否继续输入下一个成绩,回答yes就继续输入下一个成绩,回答no就停止输入成绩. 输入 ...

  5. python解zuobiaoxi方程_滑坡稳定性分析程序初探---Python版!

    0 前言 山体滑坡是常见的自然灾害,从理论分析的角度讲,滑坡的稳定性分析方法源自于高中物理学,如图1所示.前者的滑动分析非常简单,在已知滑块的重量以及接触面摩擦系数的基础上通过计算下滑力和抗滑力的关系 ...

  6. 【Python飞机大战游戏实战+笔记】黑马程序员Python教程项目实战记录【超详细】

    博主在哔哩哔哩上学习了黑马程序员的python教程,并且完成了老师讲的项目实战,为了巩固知识点通过这篇博客来记录一下. 目录 1. 创建python项目+pygame模块下载 1.1 创建项目 1.2 ...

  7. python物联网通信_物联网通信RESTDemo示例程序(Python版本)

    源码下载 app.py #!/usr/bin/python # -*- coding:utf-8 -*- from commondlib.help.ini import * from commondl ...

  8. python任务计划 0x1,0x1从任务计划程序执行python脚本时出错(Windows 10)

    我在试着运行脚本( script1.py )从 windows task scheduler . 脚本应该控制Chrome webdriver 我相信这可能是问题的根源. 结果是0x1. 在创建任务之 ...

  9. 编写python扩展模块_《深度剖析CPython解释器》27. 使用Python/C API编写扩展模块:编写扩展模块的整体流程...

    楔子 到目前为止,我们已经介绍了很多关于解释器方面的内容,本来接下来应该要说内存管理的,但是个人觉得应该对前面的系列做一个总结.而最好的方式,就是使用Python/C API编写扩展模块,个人是这么认 ...

最新文章

  1. 程序运行背后的那些事 ~ 【程序的编译(预处理操作)+链接】
  2. git 解决多人修改相同的文件导致的冲突
  3. python socket发送组播数据_Python socket 如何实现广播单播切换
  4. 添加MySql用户并授权
  5. Shell命令-文件及内容处理之split、paste
  6. securecrtp32位_SecureCRT 32位下载
  7. mysql中gbk编码汉字和英文_MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题...
  8. 学生宿舍管理项目开发计划书_学生宿舍管理系统项目-计划书.doc
  9. ftp上传当天文件的方法_8uftp上传工具,8uftp上传工具的使用方法只需8步
  10. vue将文件/图片/视频批量打包成压缩包,并进行下载
  11. TMS320F28335入门(七)eCAP学习
  12. windwos docker安装k8s一直staring的解决方法
  13. AI编译器与TPU-MLIP
  14. 逆天了!全地形、四舵轮、八连杆、独立悬挂的机器人运动结构方案,来了!
  15. java获取东八区时间
  16. 【Flink基础】-- 高效学习 flink kubernetes operator 的一些建议
  17. 最常访问的几个技术网站
  18. python tkinter 窗口颜色--数据和名称
  19. 人工智能产业盛宴:2019 AIIA开发者大会即将揭幕
  20. 文献解读|miRNA与多组学联合分析阐明花生花青素合成新机制

热门文章

  1. 计算机作曲 研究生 武汉音乐学院,武汉音乐学院2020年硕士研究生招生《计算机音乐作曲》科目考生须知...
  2. easyexcel设置表头背景颜色
  3. 挂单的java处理方案_用Java在去中心化交易所OceanOne上挂单买卖任意ERC20 token
  4. 机器臂(二)--视觉控制关节点
  5. HTML与CSS基础笔试和期末题库
  6. 微信小程序如何实现返回上一页功能
  7. 经纬恒润2023提前批秋招面试凉经
  8. [mobx] Dynamic observable objects cannot be frozen 解决记录
  9. 推导光的多普勒效应公式·比航专ppt更符合直觉
  10. codeforce 1278A(暴力水题)