大家好,我是小小明,今天我将教大家一种除了用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脚本也可以删除了。
运行效果: