zoukankan      html  css  js  c++  java
  • 使用pyinstaller 打包python脚本为exe程序


    1. 简介
    2. 环境
    3. 实操演示
    4. pyinstaller使用注意的点

    使用pyinstaller 实现python脚本打包成exe程序
    1. 简介

    将python程序打包成exe可执行程序的办法很多,如pyinstaller、py2exe、cx_Freeze等,这里介绍pyinstaller方法

    2. 环境
    • window 10 64bit

    • python 3.7.4

    • selenium 3.3.0

    • ChromePortable72

    • chromedriver

    3. pyinstall 参数介绍

    常用的主要是-F、-p、-i、-w这几个参数。

    • -a:不包含编码.在支持Unicode的python版本上默认包含所有的编码

    • -c:使用控制台子系统执行(默认)(只对Windows有效)

    • -d:产生debug版本的可执行文件

    • -i :指定打包程序使用的图标(icon)文件

    • -F:打包成可执行程序

    • -h:查看帮助

    • -p:添加使用的第三方库路径

    • -v:查看 PyInstaller 版本

    • -w:取消控制台显示(默认是显示控制台的)

    4. 实操演示

    pyinstaller提供了两种把.py文件打包成.exe文件的方式:

    1. 第一种,把由.py文件打包而成的.exe文件及相关文件放在一个目录中。

      • 代码打印一个helloworld

      • print("#####开始#####")
        print("hello world!")
        print("#####结束#####")
        
      • 成功的结果会看到

      • 打包前demo结构

      • 打包语法:pyinstaller 应用程序

        D:myprojectdemoexample2
        $ pyinstaller hello.py
        66 INFO: PyInstaller: 3.6
        67 INFO: Python: 3.7.3
        68 INFO: Platform: Windows-10-10.0.18362-SP0
        69 INFO: wrote D:myprojectdemoexample2hello.spec
        117 INFO: UPX is not available.
        120 INFO: Extending PYTHONPATH with paths
        ['D:\myproject\demo\example2', 'D:\myproject\demo\example2']
        120 INFO: checking Analysis
        121 INFO: Building Analysis because Analysis-00.toc is non existent
        121 INFO: Initializing module dependency graph...
        124 INFO: Caching module graph hooks...
        133 INFO: Analyzing base_library.zip ...
        3502 INFO: Caching module dependency graph...
        3678 INFO: running Analysis Analysis-00.toc
        3681 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
          required by d:python37python.exe
        4058 INFO: Analyzing D:myprojectdemoexample2hello.py
        4059 INFO: Processing module hooks...
        4060 INFO: Loading module hook "hook-encodings.py"...
        4206 INFO: Loading module hook "hook-pydoc.py"...
        4207 INFO: Loading module hook "hook-xml.py"...
        4440 INFO: Looking for ctypes DLLs
        4440 INFO: Analyzing run-time hooks ...
        4447 INFO: Looking for dynamic libraries
        4583 INFO: Looking for eggs
        4583 INFO: Using Python library d:python37python37.dll
        4583 INFO: Found binding redirects:
        []
        4586 INFO: Warnings written to D:myprojectdemoexample2uildhellowarn-hello.txt
        4623 INFO: Graph cross-reference written to D:myprojectdemoexample2uildhelloxref-hello.html
        4631 INFO: checking PYZ
        4631 INFO: Building PYZ because PYZ-00.toc is non existent
        4632 INFO: Building PYZ (ZlibArchive) D:myprojectdemoexample2uildhelloPYZ-00.pyz
        5195 INFO: Building PYZ (ZlibArchive) D:myprojectdemoexample2uildhelloPYZ-00.pyz completed successfully.
        5203 INFO: checking PKG
        5204 INFO: Building PKG because PKG-00.toc is non existent
        5204 INFO: Building PKG (CArchive) PKG-00.pkg
        5220 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 5222 INFO: Bootloader d:python37libsite-packagesPyInstallerootloaderWindows-64bit
        un.exe
        5222 INFO: checking EXE
        5222 INFO: Building EXE because EXE-00.toc is non existent
        5223 INFO: Building EXE from EXE-00.toc
        5224 INFO: Appending archive to EXE D:myprojectdemoexample2uildhellohello.exe
        5227 INFO: Building EXE from EXE-00.toc completed successfully.
        5230 INFO: checking COLLECT
        5231 INFO: Building COLLECT because COLLECT-00.toc is non existent
        5232 INFO: Building COLLECT COLLECT-00.toc
        8582 INFO: Building COLLECT COLLECT-00.toc completed successfully.
        
        
      • 打包后的目录结构,生成两个目录,一个文件

      1. __pycache__ 是python编译产生的文件,可不用关心
      2. build 是编译过程中的中间产物
      3. dist是最终可执行程序目录
      4. spec文件是类似缓存,如果你第二次打包,则需要先把spec删掉,否则第二次打包会受影响
      
      • 执行我们打包好的hello.exe,直接拖到cmd下回车即可

      到这里第一种打包方式就介绍完了,比较简单。

    2. 第二种,把谷歌浏览器和第三方库selenium和我们的python程序打包进一个独立的.exe格式的可执行文件。

      • 要打包的demo的目录结构

      • 打包

        $ pyinstaller -F -p selenium -p ChromePortable72ChromePortable.exe demo.py -i favicon.ico

      D:myprojectdemoexample
      $ pyinstaller -F -p selenium -p ChromePortable72ChromePortable.exe demo.py -i favicon.ico
      56 INFO: PyInstaller: 3.6
      57 INFO: Python: 3.7.3
      58 INFO: Platform: Windows-10-10.0.18362-SP0
      59 INFO: wrote D:myprojectdemoexampledemo.spec
      111 INFO: UPX is not available.
      112 INFO: Extending PYTHONPATH with paths
      ['D:\myproject\demo\example',
       'D:\myproject\demo\example\selenium',
       'D:\myproject\demo\example\ChromePortable72\ChromePortable.exe',
      
       'D:\myproject\demo\example']
      114 INFO: checking Analysis
      114 INFO: Building Analysis because Analysis-00.toc is non existent
      115 INFO: Initializing module dependency graph...
      118 INFO: Caching module graph hooks...
      126 INFO: Analyzing base_library.zip ...
      3355 INFO: Caching module dependency graph...
      3477 INFO: running Analysis Analysis-00.toc
      3479 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
        required by d:python37python.exe
      3876 INFO: Analyzing D:myprojectdemoexampledemo.py
      4847 INFO: Processing module hooks...
      4848 INFO: Loading module hook "hook-encodings.py"...
      5008 INFO: Loading module hook "hook-pydoc.py"...
      5009 INFO: Loading module hook "hook-selenium.py"...
      5018 INFO: Loading module hook "hook-xml.dom.domreg.py"...
      5019 INFO: Loading module hook "hook-xml.py"...
      5032 INFO: Looking for ctypes DLLs
      5041 INFO: Analyzing run-time hooks ...
      5048 INFO: Looking for dynamic libraries
      5226 INFO: Looking for eggs
      5227 INFO: Using Python library d:python37python37.dll
      5227 INFO: Found binding redirects:
      []
      5230 INFO: Warnings written to D:myprojectdemoexampleuilddemowarn-demo.txt
      5274 INFO: Graph cross-reference written to D:myprojectdemoexampleuilddemoxref-demo.html
      5284 INFO: checking PYZ
      5285 INFO: Building PYZ because PYZ-00.toc is non existent
      5285 INFO: Building PYZ (ZlibArchive) D:myprojectdemoexampleuilddemoPYZ-00.pyz
      6054 INFO: Building PYZ (ZlibArchive) D:myprojectdemoexampleuilddemoPYZ-00.pyz completed successfully.
      6065 INFO: checking PKG
      6065 INFO: Building PKG because PKG-00.toc is non existent
      6065 INFO: Building PKG (CArchive) PKG-00.pkg
      7997 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 8000 INFO: Bootloader d:python37libsite-packagesPyInstallerootloaderWindows-64bit
      un.exe
      8001 INFO: checking EXE
      8001 INFO: Building EXE because EXE-00.toc is non existent
      8001 INFO: Building EXE from EXE-00.toc
      8003 INFO: Copying icons from ['favicon.ico']
      8004 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
      8005 INFO: Writing RT_ICON 1 resource with 67624 bytes
      8010 INFO: Updating manifest in D:myprojectdemoexampleuilddemo
      un.exe.hbxskavy
      8011 INFO: Updating resource type 24 name 1 language 0
      8015 INFO: Appending archive to EXE D:myprojectdemoexampledistdemo.exe
      8024 INFO: Building EXE from EXE-00.toc completed successfully.
      
      • 打包后demo目录结构

      • 看下exe程序小图标是不是自己指定的kpc

      • 运行exe

      到这里,第二种打包方法也成功了。

    5. pyinstaller使用注意的点
    • pyinstaller也只能在当前操作系统中运行,比如你用mac只能打包出mac上的可执行脚本,要是你想打包出windwos电脑上的可执行程序,你就要用windows执行打包命令。
    • 如果你的脚本文件中包含其他脚本,比如hello.py包含自定义脚本(world.py)或是系统脚本(sys.py):则需要在打包的时候加上其他脚本的路径。
    通过-p指定第三方包的路径,一条路径对应一个-p
    eg:pyinstaller -F -p C:SystemLibsite-packages -p C:MyLib Hello.py
    
    • 执行一次打包命令通常会生成两个目录一个附件,分别是build、dist、和xx.spec。build是编译过程中的中间产物,dist是最终可执行程序目录,spec文件是类似缓存,如果你第二次打包,则需要先把spec删掉,否则第二次打包会受影响。
    更多学习笔记移步 https://www.cnblogs.com/kknote
  • 相关阅读:
    css 左右两栏 左边固定右边自适应
    Oracle 执行长SQL
    Oracle 游标基础
    ERROR 000464: Cannot get exclusive schema lock. Either being edited or in use by another application
    MyEclipse 批量更新编码集
    使用Windows服务发布WCF服务【转载】
    JavaScript的陷阱【转载】
    JS图片切换带超链接
    新正则表达式
    asp.net垃圾代码之asp.net去掉垃圾代码,优化aspx页面性能的方法
  • 原文地址:https://www.cnblogs.com/kknote/p/12865698.html
Copyright © 2011-2022 走看看