Python项⽬打包可执⾏⽂件(有调⽤Matlab程序)
⼀、简介
jq字符串转数组
创建本帖的⽬的是保存相关⽅法,并做简要记录。⾸先感谢两位博主,他们的⽂章⾮常详细,极⼤的⽀持我完成相应的⼯作。
接下来的部分是他们链接内容的复制,相关补充内容⽤紫⾊字体标出。
⼆、实现
1、_⽩⾦之星1717的pythonGUI调⽤matlab并打包成可执⾏⽂件的解决⽅法
本⽂为windows环境下的操作
使⽤python调⽤matlab打包成exe⽂件⾸先要会的就是---------使⽤python调⽤matlab程序
说到使⽤python调⽤matlab啊,似乎⽹上有多种解决⽅案
1.调⽤python的库mlab
mlab似乎是⼀个python库和opencv什么⼀样的,但是⼜好像需要安装matlab
,我在尝试这个⽅法的时候没有成功,说起来好⽓啊,在第⼀步我就失败了,⽹上说直接使⽤安装命令:pip install mlab
2.调⽤matlab引擎
这种⽅法是使⽤python调⽤matlab引擎来进⾏matlab运算的,事实上这是⼀个挺简单的⽅法,如果你不需要打包成exe⽂件的话那么这个⽅法应该是最省时省⼒的,需要注意的是matlab引擎只适合python2.7,3.4,3.5呢,如果你是⽤的其他版本的python 也许你应该换⼀下python的版本下⾯介绍⼀下具体操作:
⾸先安装matlab,嗯~尽量是⾼⼀点的版本但是⼜不要太⾼的好呢,我使⽤的是2017a。
⾸先在你的python环境下cd到你的matlab的安装⽬录下的MATLAB\R2017a\extern\engines\python⽬录下(如我的为C:\Program Files\MATLAB\R2017a\extern\engines\python),在这个⽬录下有⼀个setup.py⽂件,这时候输⼊命令:python setup.py install 回车
这样就应该安装好了呢,
在python⾥⾯像这样调⽤,假如说我⾃⼰写了⼀个matlab函数叫count,将count.m放到该程序运⾏的当前⽬录下,然后像这样就可以调⽤了。
ine
eng = ine.start_matlab()#可以为所欲为的调⽤matlab内置函数
a = unt(1.0,2.0) #引⽤⾃写的脚本
print(a)
b = eng.sqrt(4.) #引⽤matlab内置函数
print(b)
需要知道的是这样调⽤是不能打包的成exe⽂件的,⽬前python打包⼀般使⽤的是pyinstaller,但是他只能打包python⽂件,混合编程这样直接打包肯定不⾏,如果你直接打包,这样做可是可以成功,但是只能在⾃⼰的电脑上运⾏(这就失去了打包的意义),因为他的运⾏依赖于你电脑上的matlab,如果你直接移植的话他会报错说不到matlab引擎,我有试过使⽤python调⽤matlab引擎然后再别⼈电脑上安装MCR(在后⾯介绍什么是MCR)来达到打包移植的效果,但是也没能到matlab引擎,然后
我⼜深⼊到matlab内部修改了引擎的地址什么的,但是还是没有到,说到底这种⽅法还是有点邪门歪道、不够官⽅,不过有想法总是好的。
3.将matlab程序打包成dll调⽤
主要思路就是将⾃⼰的matlab程序打包成dll,然后通过python中的ctypes模块调⽤dll来解决
有⼀位⼗分低调的博主写了⼀篇博客,他⾥⾯有只有两个视频,是关于如何调⽤的,他⾃⼰写了⼀个add(a,b)函数(两个数相加)来做例⼦,我按着他的例⼦做了,也成功了,但是⼀⽤我⾃⼰写的代码来测试的时候便失败了,报错是调⽤动态库的时候没到函数,也许是我的代码太复杂了(我不知道,我乱说的)。他那⽚⽂章真的很难,我现在还没,到。他在打包成dll的时候是使⽤的matlab coder ,其他的python调⽤dll什么的,你们⾃⼰百度⼀下应该就会了
⾸先打开matlab,在matlab命令⾏⾥输⼊deploytool,选择Library Compiler,然后在左上⾓选择python package,然后再中间(粉⾊)那⾥选择你要打包的函数⽂件(点那个蓝⾊的加号),这个⽅法会把你选择的matlab函数⽂件打包成⼀个python库你可以再下⾯设置库名(Library name)
假如说你的⼀个matlab函数调⽤了另外的你写的matlab函数,这个时候你要把你调⽤的函数也传上去,不过这个传是再在Files required for your library to run  (你的库依赖的⽂件)这⾏的右下的那个加号,你可以这样理解,之前在粉⾊区域选择的是你在python中要调⽤的⼊⼝函数,这⾥选择的是⼊⼝函数的依赖函数,当⼀切都填好的时候点击最右上⾓的那个package就好了
过⼀会,在你的相对⽬录下会⽣成⼀个以你的库名为名的⽂件夹,⽐如说我的是这样的。
(中间的for_redistribution_files_only⽂件夹下才是⽣成的库,如例为hill,将该⽂件激活后复制到需要调⽤的python程序路径下,然后载import hill )
下⾯开始为你的python环境安装你⾃⼰⽤matlab写的python库,打开cmd,激活你要装库的python环境,cd 到刚刚的
for_redistribution_files_only⽂件夹下(⽐如说我的是这样的C:\Users\Administrator\Desktop\hill\for_redistribution_files_only)输⼊命令:python setup.py install  然后就装好了。
下⾯讲解⼀下如何在python⾥⾯调⽤刚刚写的python模块
就拿我的⾃⼰⽣成的库来说吧,我创建了⼀个hill库,⾥⾯有两个⼊⼝函数F1(a,b)和F2(c),代码是这个亚⼦的:
import hill
hill_ob = hill.initialize()
m = 1
n = 2
o =3
w = hill_ob.F1(m,n)
hill_ob.F2(o)
需要注意的是如果你的函数返回值有n个(⼀个可以不写),那么你在写的时候⼀定要加⼀个nargout=n,
代码是这个亚⼦:
w ,x,y= hill_ob.F1(m,n,nargout=3)
这样就调⽤完成了。
打包时直接使⽤pyinstaller打包就好了,可能最常见的问题是打包后,双击exe程序闪退,这个⾸先可能是你代码本⾝就有问题,如果代码没问题,那么应该就是环境打包出问题了,也就是说环境没打包全,这个时候,你打开cmd,在cmd⾥⾯执⾏⼀下你的程序,这样就可以看到是哪错了,然后你再打开你的python环境,在Lib\site-packages\⾥⾯到你出错的那个库,将他复制,粘贴到你的exe的环境中(替换之前的同名⽂件),这样⼦就完成了。
⽆需安装 MATLAB 即可运⾏编译的 MATLAB 应⽤程序或组件-----MCR
要想⾃⼰的可执⾏程序在别⼈的电脑上运⾏,还需要在别⼈的电脑上安装matlab的环境——————MCR(MATLAB Runtime)
MATLAB Runtime 是⼀套独⽴的共享库,可以执⾏已编译的 MATLAB 应⽤程序或组件。当 MATLAB、MATLAB Compiler 和MATLAB Runtime ⼀起使⽤时,您可以快速、安全地创建和分布数值应⽤程序或软件组件。
在安装MCR的时候安装⽬录可以随便选,因为安装后他会⾃动添加到环境变量,安装时没什么要特别注意的,⼀直点下⼀步就好了。2、Python Pyinstaller安装和使⽤教程
在创建了独⽴应⽤(⾃包含该应⽤的依赖包)之后,还可以使⽤ PyInstaller 将  程序⽣成可直接运⾏的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运⾏。
安装 PyInstaller
Python 默认并不包含 PyInstaller 模块,因此需要⾃⾏安装 PyInstaller 模块。
安装 PyInstaller 模块与安装其他 Python 模块⼀样,使⽤ pip 命令安装即可。在命令⾏输⼊如下命令:
pip install pyinstaller
强烈建议使⽤ pip 在线安装的⽅式来安装 PyInstaller 模块,不要使⽤离线包的⽅式来安装,因为 PyInstaller 模块还依赖其他模块,pip 在安装 PyInstaller 模块时会先安装它的依赖模块。
运⾏上⾯命令,应该看到如下输出结果:
Successfully
其中的 x.x.x 代表 PyInstaller 的版本。
在 PyInstaller 模块安装成功之后,在 Python 的安装⽬录下的 Scripts(D:\Python\Python36\Scripts) ⽬录下会增加⼀个 程序,接下来就可以使⽤该⼯具将 Python 程序⽣成 EXE 程序了。
PyInstaller⽣成可执⾏程序
PyInstaller ⼯具的命令语法如下:
pyinstaller 选项 Python 源⽂件
不管这个 Python 应⽤是单⽂件的应⽤,还是多⽂件的应⽤,只要在使⽤ pyinstaller 命令时编译作为程序⼊⼝的 Python 程序即可。
PyInstaller⼯具是跨平台的,它既可以在 Windows平台上使⽤,也可以在 Mac OS X 平台上运⾏。在不同的平台上使⽤ PyInstaller ⼯具的⽅法是⼀样的,它们⽀持的选项也是⼀样的。
python安装教程mac下⾯先创建⼀个 app ⽬录,在该⽬录下创建⼀个 app.py ⽂件,⽂件中包含如下代码:
1. from say_hello import *
2.
3. def main():
4. print('程序开始执⾏')
css3盒子模型制作的效果图
5. print(say_hello('孙悟空'))
6. # 增加调⽤main()函数
7. if __name__ == '__main__':
8. main()
接下来使⽤命令⾏⼯具进⼊到此 app ⽬录下,执⾏如下命令:
pyinstaller -F app.py
执⾏上⾯命令,将看到详细的⽣成过程。当⽣成完成后,将会在此 app ⽬录下看到多了⼀个 dist ⽬录,并在该⽬录下看到有⼀个 ⽂件,这就是使⽤ PyInstaller ⼯具⽣成的 EXE 程序。
在命令⾏窗⼝中进⼊ dist ⽬录下,在该⽬录执⾏ ,将会看到该程序⽣成如下输出结果:
程序开始执⾏
孙悟空,您好!
由于该程序没有图形⽤户界⾯,因此如果读者试图通过双击来运⾏该程序,则只能看到程序窗⼝⼀闪就消失了,这样将⽆法看到该程序的输出结果。
在上⾯命令中使⽤了-F 选项,该选项指定⽣成单独的 EXE ⽂件,因此,在 dist ⽬录下⽣成了⼀个单独的⼤约为 6MB 的 ⽂件(在 Mac OS X 平台上⽣成的⽂件就叫 app,没有后缀);与 -F 选项对应的是 -D 选项(默认选项),该选项指定⽣成⼀个⽬录(包含多个⽂件)来作为程序。
下⾯先将 PyInstaller ⼯具在 app ⽬录下⽣成的 build、dist ⽬录删除,并将 app.spec ⽂件也删除,然后使⽤如下命令来⽣成 EXE ⽂件。
pyinstaller -D app.py
执⾏上⾯命令,将看到详细的⽣成过程。当⽣成完成后,将会在 app ⽬录下看到多了⼀个 dist ⽬录,并在该⽬录下看到有⼀个 app ⼦⽬录,在该⼦⽬录下包含了⼤量 .dll ⽂件和 .pyz ⽂件,它们都是 程序的⽀撑⽂件。在命令⾏窗⼝中运⾏该 程序,同样可以看到与前⼀个 程序相同的输出结果。
PyInstaller 不仅⽀持 -F、-D 选项,⽽且也⽀持如表 1 所⽰的常⽤选项。
表 1 PyInstaller ⽀持的常⽤选项
-h,--help查看该模块的帮助信息
-F,-onefile产⽣单个的可执⾏⽂件
-D,--onedir产⽣⼀个⽬录(包含多个⽂件)作为可执⾏程序
-a,--ascii不包含 Unicode 字符集⽀持
-d,--debug产⽣ debug 版本的可执⾏⽂件
apicloud菜鸟教程
-w,--windowed,--
record名词形式noconsolc
指定程序运⾏时不显⽰命令⾏窗⼝(仅对 Windows 有效)
-c,--nowindowed,--
console
指定使⽤命令⾏窗⼝运⾏程序(仅对 Windows 有效)
-o DIR,--out=DIR指定 spec ⽂件的⽣成⽬录。如果没有指定,则默认使⽤当前⽬录来⽣成 spec ⽂件
-p DIR,--path=DIR 设置 Python 导⼊模块的路径(和设置 PYTHONPATH 环境变量的作⽤相似)。也可使⽤路径分隔符(Windows 使⽤分号,Linux 使⽤冒号)来分隔多个路径
-n NAME,--
name=NAME
指定项⽬(产⽣的 spec)名字。如果省略该选项,那么第⼀个脚本的主⽂件名将作为 spec 的名字
在表 1 中列出的只是 PyInstaller 模块所⽀持的常⽤选项,如果需要了解 PyInstaller 选项的详细信息,则可通过 pyinstaller -h 来查看。下⾯再创建⼀个带图形⽤户界⾯,可以访问  数据库的应⽤程序。
在 app 当前所在⽬录再创建⼀个 dbapp ⽬录,并在该⽬录下创建 Python 程序,其中 exec_select.py 程序负责查询数据,main.py 程序负责创建图形⽤户界⾯来显⽰查询结果。
exec_select.py ⽂件包含的代码如下:
1. # 导⼊访问MySQL的模块
2. tor
mapinfo参考手册3.
4. def query_db():
5. # ①、连接数据库
6. conn = conn = t(user='root', password='32147',
7. host='localhost', port='3306',
8. database='python', use_unicode=True)
9. # ②、获取游标
10. c = conn.cursor()
11. # ③、调⽤执⾏select语句查询数据
12. c.execute('select * from user_tb where user_id > %s', (2,))
13. # 通过游标的description属性获取列信息
14. description = c.description

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。