使用pyinstaller -D -w mainwindow.py
pyinstaller -D mainwindow.py --additional-hooks-dir=hooks
进行打包,在需要打包的ython文件同目录处新建一个hooks
文件夹,见下图。(下一种方法更加推荐)文件夹内可以放如下两个文件hook-matlab.py
以及hook-matlab.engine.py
两个文件。如下图所示。
hook-matlab.py内容
from PyInstaller.utils.hooks import collect_all
datas, binaries, hiddenimports = collect_all('matlab')
hook-matlab.engine.py内容
from PyInstaller.utils.hooks import collect_all
datas, binaries, hiddenimports = collect_all('engine')
spec
文件# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['mainwindow.py'],
pathex=['E:\\Anaconda3\\envs\\pyqtPython\\Lib\\site-packages\\matlab'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='mainwindow',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='mainwindow')
除此之外,还需要找到python安装路径下的pyinstaller包安装的位置,在其hooks
文件夹里添加上述hook-matlab.py
以及hook-matlab.engine.py
两个文件。
经过上述操作,打包完成的exe程序已经能在开发程序的本地计算机上顺利运行了,但是将其更换到其他计算机的时候就会发现,会报错误如下所示。
找不到程序中matlab开发的包OSError: Please reinstall MATLAB Engine for Python or contact MathWorks Technical Support for assistance: No module named 'matlabengineforpython3_6'
包错误的原因主要是因为,我们开发的exe程序,是通过exe文件依赖的matlab包是通过_arch.txt
文件来查找的。打开_arch.txt
文件我们可以看到如下信息。
然后我们在别的电脑上,将里面的路径换成对应电脑上matlab的安装路径就可以正常运行了。
不过这样做的缺点就是,在使用exe的计算机上也需要安装matlab。,并且matlab版本需要和开发程序所需要的python版本对应。比如说,我现在用的是matlab2018a,开发的python版本是3.6,然后我测试电脑上安装的matlab也是2018a版本的,我不确定别的适合python3.6版本matlab是不是可以正常使用。。。。。。。。
用的方法比较笨 ,主要是因为,代码已经写好了不想改了,属于是曲线救国了,其实利用python来调用matlab有很多方法,可以打包成dll或者打包成别的开发包之类的,都可以,这个方法纯属采集互啄曲线救国了,,,,,😞
因篇幅问题不能全部显示,请点此查看更多更全内容