制作绿化版Python解锁Python桌面程序的高级打包方式
大家好,我是小小明,今天我将教大家一种除了用python内置库打包,让没有安装python的机器能够直接运行python程序的方法。
具体原理就是我们制作一个绿化版的python,将其放在项目目录下,用系统对应的脚步去调用相应命令启动程序。当然本文只针对Windows平台,对于Mac平台应该原理也差不多,大家可以再理解本文的操作逻辑后,再针对性在Mac平台操作。
注意:如果希望打包后的项目不带源代码,可以将项目批量编译为pyc后再进行打包。如果对源代码的安全性有更高的要求,可以使用编译为pyd格式后再进行打包。
最终本文的打包后的效果如下:
至于pyd格式,读者们可以自行研究。
首先我们需要制作一个绿化版python备用:
绿化版python的制作
下载zip包
首先我们需要去下载一个解压版(zip格式)的python,注意不要下载安装版的。
各版本的下载地址在:https://www.python.org/ftp/python/
这里面包含了全部版本的原生python:
我选择了3.7.4这个版本:
每个版本下面可以选择的下载文件很多:
- 从系统位数分为32位和64位;
- 从平台分为Windows、Mac和Linux;
- 从类型分为beta版、rc版和正式版。
beta版表示测试版;rc表示发布候选预览版;rc1则表示第一个维护版本的发布预览版,rc2则表示第二个候选发行版是正式版最终发布前的最后检查。
因此我们根据自己的情况选择64位Windows平台的正式版,即上图所示的安装包,下载地址:
https://www.python.org/ftp/python/3.7.4/python-3.7.4-embed-amd64.zip
下载完成之后我们就可以解压安装包了:
解压后的python非常纯净,连pip都没有,现在我们需要安装pip:
安装pip
在https://pip.pypa.io/en/stable/installing/下我们可以找到get-pip.py脚本的下载链接:
下载地址:https://bootstrap.pypa.io/get-pip.py
我们将其下载到前面解压的python目录下,在Windows命令行的操作方式是:
certutil -urlcache -split -f https://bootstrap.pypa.io/get-pip.py
然后执行安装pip:
python get-pip.py
安装完成后,python路径下增加了两个文件夹。可以在Scripts目录下找到安装好的pip文件:
用winhex打开可以看到其实4个文件的内容完全一样。
为了增加pip的通用性,我们可以用Sublime等文本编辑器打开pip.exe文件,修改python所在的路径(我使用的是notepad++):
拖到底可以看到原本的python路径是一个绝对路径。下面我们改成相对路径,方便我们将绿化版python移动到任何地方后都可以使用pip安装库。
打算以后直接在pip所在路径下执行pip命令,那么python就位于相对于当前目录的上级目录中,所所以我改成了..\python.exe
:
但这时我们还无法正常使用pip,会出现如下问题:
E:\tmp\python-3.7.4-embed-amd64\Scripts>pip
Traceback (most recent call last):
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\runpy.py", line 193, in _run_module_as_main
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\runpy.py", line 85, in _run_code
File "E:\tmp\python-3.7.4-embed-amd64\Scripts\pip.exe\__main__.py", line 4, in <module>
ModuleNotFoundError: No module named 'pip'
这时我们需要修改python根目录的下的python37._pth
文件,同样使用文本编辑器打开,取消import site的注释即可。修改完成后如下:
此时再次执行pip:
E:\tmp\python-3.7.4-embed-amd64\Scripts>pip list
Package Version
---------- -------
pip 21.1.3
setuptools 57.1.0
wheel 0.36.2
至此pip已经可以用来安装常用的包了。
添加项目目录到默认模块搜索路径
后面我们的绿化版python是打算放在项目根目录下面,为了能够将项目根目录加入模块默认搜索路径中,所以上面的python37._pth
文件再增加..
表示上级目录,修改后:
绿化版python安装tkinter
这步并没有啥可以直接安装的方案,经过一番研究,我们可以把安装版中的tkinter相关文件都copy到当前的项目目录下。
下面操作前,先将python-3.7.4-embed-amd64重命名为py374。
需要将以下2个目录3个文件复制到py374根目录下:
- 安装版python的tcl目录
- 安装版python的Lib\tkinter目录
- 安装版python的DLLs目录下的tcl86t.dll、tk86t.dll和_tkinter.pyd三个文件
复制后:
测试一下:
可以看到在绿化版python中能够正常使用tk。
至此我们的绿化版python就制作完成,可以随项目一起打包。当前最纯净的状态可以收藏起来备份,随时copy到新项目中。也可以按照同样的思路制作其他版本的绿化版python。
绿化版python下载地址
为了大家方便我将上面已经做好的绿化版python分享出来,可以在下面地址下载:
链接:https://pan.baidu.com/s/1TGCudL42y9J94U5Rj77idQ
提取码:rcyz
使用示例
库安装
在制作好Windows平台的绿化版python后,我们就可以尝试使用它对某个项目打包了,这里我们以前面写的抽奖程序为例来操作。
这个小项目就两个文件,将前面做好的绿化版python放于项目根目录下:
然后进入项目python中的pip所在文件夹安装程序所需要的库:
pip install PySimpleGUI
于是我们可以先尝试直接运行一下:
可以看到通过绿化版python程序正常运行。
vbs运行脚本
至此我们可以封装一个vbs脚本run.vbs
,内容如下:
Set ws = CreateObject("WScript.Shell")
ws.Run "py374\pythonw lottery_draw.py"
然后用户只需直接双击打开run.vbs
文件即可直接运行程序:
注意:pythonw命令相对于python命令不会产生多余的黑窗界面。
bat脚本转exe
如果更喜欢exe格式或希望自定义程序图标,还可以写bat脚本,然后通过一些工具转成exe。
首先编写bat脚本run.bat
,内容如下:
py374\pythonw lottery_draw.py
然后打开Bat_To_Exe_Converter工具(百度一下有很多网址可以下载):
然后就得到了自定义图标的exe文件:
双击exe正常运行,打开速度几乎与直接用python命令运行一致。
编译pyc文件打包
上面的打包方法直接带上python源代码可能并不是太好,这时候我们可以把项目下的所有py脚本都编译成pyc。
一次性全部编译的命令是:
python -m compileall .
编译后每个子文件夹下面都会产生一个__pycache__
目录:
]
这个项目只有两个文件,我们可以人工的移动并修改文件名。考虑到一个项目文件可能很多,想要全部都编译的话,可以使用py脚本编译并批量重命名:
"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
import compileall
compileall.compile_dir('.')
from pathlib import Path
import os
import shutil
files = Path(".").glob("**/__pycache__/*.pyc")
if os.path.exists("pycfiles"):
shutil.rmtree("pycfiles")
os.makedirs("pycfiles")
for file in files:
pyc_name = file.name[:file.name.find(".")] + ".pyc"
if pyc_name == Path(__file__).name+"c":
continue
floder = file.parent.parent
if not os.path.exists(f"pycfiles/{floder}"):
os.mkdir(f"pycfiles/{floder}")
pyc_name = f"pycfiles/{floder}/{pyc_name}"
print(file, '->', pyc_name)
os.rename(file, pyc_name)
将该脚本放到项目目录下运行后,将得到一个pycfiles目录:
]
此时我们可以将绿化版python复制到pycfiles目录下:
然后编写bat运行脚本:
py374\pythonw lottery_draw.pyc
然后使用Bat_To_Exe_Converter工具生成exe。之后bat脚本也可以删除了。
运行效果:
相关文章
- Python虚拟环境的安装和配置-virtualenv与windows下多个python版本共存
- “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- Python程序 #!/usr/bin/python 的解释
- python 使用 thrift 教程
- python中实现mysql连接池
- 【Reading Note】Python读书杂记
- Python正则表达式如何进行字符串替换实例
- 程序员的算法趣题:Python全解(2023-03-07:追加github repo)
- 26岁,转行Python,是这辈子最成功的一件事......
- Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略
- Python:更改默认启动的python程序及其对应的安装包路径(更改pip的默认安装包的路径)图文教程之详细攻略
- Python:更改默认启动的python程序及其对应的安装包路径(更改pip的默认安装包的路径)图文教程之详细攻略
- Python之matplotlib:基于matplotlib库利用python语言实现一张画布显示多张图的多种方法
- Python每日一练——第28天:面向对象
- 已解决2.Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and wi
- 13天搞定python分布式爬虫(视频+项目双管齐下)
- 从零开始学python | 什么是Python JSON?
- Python编程:为世界贡献你的轮子-pipy打包
- Python编程:判断字符串中是否包含中文
- Python编程:查看python语法中的关键字keyword
- 雅虎财经数据python 网络爬虫stock股票 用 Python 通过雅虎财经获取股票数据
- python学习===将py文件从打包成exe程序
- 莫烦python教程地址
- 多版本Python共存时pip给指定版本的python安装package的方法
- 〖Python自动化办公篇㉑〗- python实现邮件自动化 - 定时发送邮件
- pyinstaller 打包你的python程序