python代码打包到exe的实现示例

作者:

文章目录
  • 交给其他同事用python编写的工具,没安装python就比较麻烦,所以学习如何把python源代码打包,在没有python环境的电脑也可以使用。
  • 实际使用的是国内清华源的工具,网速会快一点 pip install Pyinstaller pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源 需要注意,这里若出现 pip不是内部外部指令的提示,说明python安装路径没有设置未系统变量,具体操作为:控制面板-系统设置-高级设置-环境变量-系统变量 添加python的安装路径一般 C:Userssherry.pengAppDataLocalProgramsPythonPython39Scripts C:Userssherry.pengAppDataLocalProgramsPythonPython39
  • pyinstaller [参数] your_script.py pyinstaller -F -w -i xxx.ico xxx.py -p x:…site_packages 常用参数说明: 参数 含义 -F 或 –onefile 将程序打包为 单个 EXE 文件,便于分发。 -D 或 –onedir 生成一个包含多个依赖文件的目录(默认选项)。 -w 或 –windowed 不显示控制台窗口(适用于 GUI 程序)。 -c 或 –console 显示控制台窗口(默认)。 –noconsole 关闭显示控制台窗口。 -i –icon=mxicon.ico 添加xxx.ico图标 -p 添加环境site-packages文件夹绝对路径 –add-data=”C:Userssherry.pengAppDataLocalProgramsPythonPython39Libsite-packagespyecharts;pyecharts”
  • 1.一般的.py,没有什么特殊的依赖库,直接打包成单个exe Pyinstaller -F normal.py 2.有些第三方的库,不能打包到exe。例如,pyecharts。一般是,打包的时候,添加一下依赖库的路径。但是,这个路径没有生效,现在是把pyecharts的依赖库文件夹和exe放到一个目录下就可以了。 Pyinstaller -F normal_pyecharts.py –add-data=”C:Userssherry.pengAppDataLocalProgramsPythonPython39Libsite-packagespyecharts;pyecharts” 3.除了.py,还依赖其他库,其他格式文件。例如ToolSet.py要调用其他IMU.exe,为了方便替换,第一次可以打包成文件夹,手动添加依赖库、依赖的其他文件。后续可以直接在文件夹里替换exe。有时候不想要命令行窗口出现,用 –noconsole Pyinstaller -D ToolSet.py Pyinstaller -F ToolSet.py –noconsole
  • 目录
    • 一、背景
    • 二、安装打包工具 Pyinstaller
    • 三、打包命令说明
      • 1. 单个 .py打包成exe(一般)
      • 2.配套其他格式文件打包到exe
        • 2.1 添加图标
        • 2.2 取消命令行窗口
        • 2.3 配套其他格式文件(.txt .jpg等等)
      • 3. 多个.py打包成exe
        • 方法1: pyinstaller直接运行得到
        • 方法2:spec运行得到
      • 4. exe、依赖库打包到文件夹
      • 四、打包命令输入方法
        • 方法1:cmd
          • 方法2:pychram-terminal
            • 方法3:新建.py
            • 五、 例如:项目ToolSet
              • 六、调试
                • 6.1.尽量使用from xxx import xxx,而不是直接import xxx
                  • 6.2.保留了命令行窗口,可以看到有什么异常进而进行修改
                    • 6.3 ModuleNotFoundError可能缺少相应的pyd文件

                    交给其他同事用python编写的工具,没安装python就比较麻烦,所以学习如何把python源代码打包,在没有python环境的电脑也可以使用。

                    实际使用的是国内清华源的工具,网速会快一点

                    pip install Pyinstaller
                    pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源
                    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源
                    

                    需要注意,这里若出现 pip不是内部外部指令的提示,说明python安装路径没有设置未系统变量,具体操作为:控制面板-系统设置-高级设置-环境变量-系统变量 添加python的安装路径一般

                    C:Userssherry.pengAppDataLocalProgramsPythonPython39Scripts
                    C:Userssherry.pengAppDataLocalProgramsPythonPython39
                    

                    pyinstaller [参数] your_script.py
                    pyinstaller -F -w -i xxx.ico xxx.py -p x:...site_packages
                    

                    常用参数说明:

                    参数 含义
                    -F 或 –onefile 将程序打包为 单个 EXE 文件,便于分发。
                    -D 或 –onedir 生成一个包含多个依赖文件的目录(默认选项)。
                    -w 或 –windowed 不显示控制台窗口(适用于 GUI 程序)。
                    -c 或 –console 显示控制台窗口(默认)。
                    –noconsole 关闭显示控制台窗口。
                    -i –icon=mxicon.ico 添加xxx.ico图标
                    -p 添加环境site-packages文件夹绝对路径
                    --add-data="C:Userssherry.pengAppDataLocalProgramsPythonPython39Libsite-packagespyecharts;pyecharts"
                    

                    Pyinstaller -F xxxxx.py
                    

                    运行后会生成一个dist文件夹,文件夹内就是需要的exe文件

                    pyinstaller -w -F  xxx.py -i xxx.ico
                    

                    pyinstaller -F xxx.py -i xxx.ico
                    
                    Pyinstaller -F xxxxx.py --icon=mxicon.ico
                    

                    在工程里写一个打包的.py,执行可以得到build 和dist 文件夹,dist文件夹里就只有exe

                    pyinstaller -F -w xxx.py -i xxx.ico
                    pyinstaller -F mycode.py --noconsole
                    

                    方法1:.spec文件

                    1.pycharm中运行.py后生成同名.spec文件
                    或者命令行实现:进入项目根目录、运行得到spec文件

                    cd ...project  (pathex)
                    pyi-makespec xxx.py
                    

                    2.修改spec文件,添加其他格式文件到 datas
                    这里面是放非.py文件,这里是以元组的形式,
                    (“文件夹的绝对路径”,“文件夹名”)
                    注意这里不是写具体的文件名,而是文件夹
                    或者通过参数添加

                    --add-data="...xxxxxxxxxpyecharts;pyecharts"
                    

                    3.执行指令打包.spec

                    pyinstaller -F -w -i xxx.ico xxx.spec
                    

                    dist/xxx/xxx.exe
                    运行后会得到一个dist文件夹,文件夹里面又一个以xxx命名的文件夹,在xxx文件夹里面找到exe即可

                    方法2: 直接运行dist+data文件夹

                    将存放了非py文件的data文件移动到文件夹下即可

                    注意:因为涉及到非py文件,所以在py文件编写的时候,涉及到引用这些非py文件时,需要对文件的根目录进行获取:

                    一般是先自动获取得到当前exe的根目录dirfile;

                    然后通过字符串拼接来得到非py文件的具体文件夹:dirfile + “data非py文件名”

                    pyinstaller -w -i data\fa.ico firstUI_logic.py firstUI.py getFeathers.py nms.py operateUI.py operateUI_logic.py  -p D:softwares_installAnaconda3envsTrainLibsite-packages
                    

                    pyinstaller 所有需要打包的py文件 -p 环境site-packages绝对路径

                    注意:py文件的路径需要以第一个py文件为准
                    运行后会得到dist,在dist里面的firstUI_logic文件夹中找到exe文件即可

                    sepc同 2.3 所述

                    要在第一行,也就是a = Analysis([xxx.py’])这里面添加你的所有的.py文件,
                    注意是所有的而且只能是.py文件,第一个是代码你的入口文件。
                    另外假如.py文件不是与你的主入口文件main.py文件在同一个目录下,那么该文件要写绝对路径。

                    有些第三方的库不能打包到exe,例如Pyecharts(有的环境目录地址单引号他就一直报错)

                    Pyinstaller -F HeadingAnalysisTool.py --add-data="C:Userssherry.pengAppDataLocalProgramsPythonPython39Libsite-packagespyecharts;pyecharts"  (好像引用库文件没有成功)

                    一般打包成文件夹,再复制相关库到文件夹,用-D不用-F

                    Pyinstaller -D HeadingAnalysisTool.py 
                    

                    文件夹地址栏输入cmd进入命令窗口,输出指令打包py文件,一小会儿,不到1min打包成功,在dist文件夹可见exe

                    在pychram-terminal输入打包指令

                    在工程里写一个打包的.py,执行可以得到build 和dist 文件夹,dist文件夹里就只有exe

                    import os
                    if __name__ == '__main__':
                        from PyInstaller.__main__ import run
                        opts = ['HeadingAnalysis.py', '-w', '-F', '--icon=mxicon.ico']
                        run(opts)
                    

                    1.一般的.py,没有什么特殊的依赖库,直接打包成单个exe

                    Pyinstaller -F normal.py
                    

                    2.有些第三方的库,不能打包到exe。例如,pyecharts。一般是,打包的时候,添加一下依赖库的路径。但是,这个路径没有生效,现在是把pyecharts的依赖库文件夹和exe放到一个目录下就可以了。

                    Pyinstaller -F normal_pyecharts.py --add-data="C:Userssherry.pengAppDataLocalProgramsPythonPython39Libsite-packagespyecharts;pyecharts"
                    

                    3.除了.py,还依赖其他库,其他格式文件。例如ToolSet.py要调用其他IMU.exe,为了方便替换,第一次可以打包成文件夹,手动添加依赖库、依赖的其他文件。后续可以直接在文件夹里替换exe。有时候不想要命令行窗口出现,用 –noconsole

                    Pyinstaller -D ToolSet.py 
                    Pyinstaller -F ToolSet.py --noconsole
                    

                    在编写时,尽量使用from xxx import xxx,而不是直接import xxx,然后通过xxx.xxx来使用。比如from cv2 import imread,和import cv2,前者只是导入了imread,而后者直接复制了cv2,导致后续打包的exe过大

                    根据以往的经验一般是使用【+移动data文件夹+保留命令行窗口】方法来进行打包,成功率高,且通过命令行来进行exe运行,可以看到有什么异常进而进行修改

                    pyinstaller  -i data\fa.ico firstUI_logic.py firstUI.py getFeathers.py nms.py operateUI.py operateUI_logic.py  -p D:softwares_installAnaconda3envsTrainLibsite-packages
                    

                    注意没有-w,保留了命令行窗口

                    有时候可能会出现导入包错误,可能在打包好的文件夹中对应的包位置缺少了相应的pyd文件,比如pyinstaller打包执行exe出现
                    “ModuleNotFoundError: No module named scipy.spatial.transform._rotation_group”

                    上述其实就是说明在打包完成的dist文件夹中的文件夹中对应的库中缺少pyd文件,需要补充上
                    这个是因为打包后的第三方库中缺少了pyd文件
                    具体的解决方法:
                    去环境下找到相应的py文件,将py编译成pyd文件,然后将pyd文件复制到dist相应的第三库目录下即可
                    1.安装easycython库

                    pip install easycython
                    

                    test.py

                    def test():
                        print("调用成功")
                    
                    

                    main.py

                    import test
                    test.test()
                    

                    test.py文件重命名为:test.pyx
                    终端运行命令

                    easycython *.pyx
                    

                    重命名pyd文件,删除:cp36-win_amd64.

                    运行代码,调用成功:

                    python main.py
                    

                    到此这篇关于python代码打包到exe的实现示例的文章就介绍到这了,更多相关python 打包到exe内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

                    您可能感兴趣的文章:

                    • 一篇文章学会两种将python打包成exe的方式
                    • Python打包为exe详细教程
                    • 使用cx_freeze把python打包exe示例
                    • Python打包成.exe可执行文件的详细步骤
                    • Python打包成exe文件的详细操作指南
                    • 史上最详细的Python打包成exe文件教程
                    • Python打包后的exe还原成.py的实现步骤
                    • 将python打包后的exe还原成py
                    • Python打包exe时各种异常处理方案总结
                    • Python打包代码成exe可执行文件的方法总结
                    • Python打包成exe常用的四种方法小结
                    • Python打包成exe的两种方法

                    站内搜索