• c#项目调用Python模块的方法


    将Python模块用pyinstaller打包成exe程序

    • 下载安装UPX((http://upx.sourceforge.net/) ) ,并把路径加到环境变量中。

      UPX是开源的加壳和压缩exe的程序,使用UPX能有效减小发布的exe文件体积。

    • 安装PyInstaller:

    pip install pyinstaller
    
    python setup.py build_ext --inplace
    

    setup.py是我们要调用的Python模块安装入口,它主要包含Python模块的依赖项和要打包的文件清单。

    • 使用pyinstaller打包python程序。

    Pyinstaller基本使用方法

    Pyinstaller可以通过简单的命令进行python代码的打包工作,其基本的命令为:

    pyinstaller -option xxx.py
    

    options的详情可参考官方帮助文档https://pyinstaller.readthedocs.io/en/stable/usage.html

    这边只介绍用到的option:-d生成一个文件目录包含可执行文件和相关动态链接库和资源文件等;
    -f仅生成一个可执行文件

    -D, --onedir Create a one-folder bundle containing an executable (default)
    -F, --onefile Create a one-file bundled executable.

    对于打包结果较大的项目,选用-d生成目录相比单可执行文件的打包方式,执行速度更快,但包含更加多的文件。本文的例子选中-d方式打包。

    Python项目的打包方法

    1.spec文件生成

    为了进行自定义配置的打包,首先需要编写打包的配置文件.spec文件。当使用pyinstaller -d xxx.py时候会生成默认的xxx.spec文件进行默认的打包配置。通过配置spec脚本,并执行pyinstaller -d xxx.spec完成自定义的打包。

    通过生成spec文件的命令,针对代码的主程序文件生成打包对应的spec文件

     pyi-makespec -w xxx.py
    

    打开生成的spec文件,修改其默认脚本,完成自定义打包需要的配置。spec文件是一个python脚本,其默认的结构如下例所示

    # -*- mode: python -*-
     
    block_cipher = None
     
     
    a = Analysis(['fastplot.py'],
                 pathex=['D:\install_test\DAGUI-0.1\bin'],
                 binaries=[],
                 datas=[],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              exclude_binaries=True,
              name='fastplot',
              debug=False,
              strip=False,
              upx=True,
              console=False )
    coll = COLLECT(exe,
                   a.binaries,
                   a.zipfiles,
                   a.datas,
                   strip=False,
                   upx=True,
                   name='fastplot')
    

    spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT.

    • Analysis以py文件为输入,它会分析py文件的依赖模块,并生成相应的信息
    • PYZ是一个.pyz的压缩包,包含程序运行需要的所有依赖
    • EXE根据上面两项生成
    • COLLECT生成其他部分的输出文件夹,COLLECT也可以没有

    2.spec文件配置

    a) py文件打包配置

    针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。如上的spec脚本,将所有项目中的py文件路径以列表形式写入Analysis,这里为了说明混合使用了绝对路径和相对路径。

    b) 资源文件打包配置

    资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas,datas接收元组:datas=[(SETUP_DIR+‘libicon’,‘libicon’),(SETUP_DIR+‘data’,‘data’)]。元组的组成为(原项目中资源文件路径,打包后路径)。

    c)Hidden import配置

    pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块,如例子中所示。

    d)递归深度设置

    在打包导入某些模块时,常会出现"RecursionError: maximum recursion depth exceeded"的错误,这可能是打包时出现了大量的递归超出了python预设的递归深度。因此需要在spec文件上添加递归深度的设置,设置一个足够大的值来保证打包的进行,即

    import sys
    sys.setrecursionlimit(5000)
    

    3.使用pyinstaller命令执行 spec配置打包

    pyinstaller -D xxx.spec
    

    打包生成两个文件目录build和dist,build为临时文件目录完成打包后可以删除;dist中存放打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下。

    注意:要打包的python模块的依赖项比如numpy等最好在pyinstaller安装之前,可避免生成错误。

    c#调用pyinstaller打包的exe程序

    • 将pyinstaller打包后的dist文件下的内容添加到c#项目中
    • c#调用exe代码:
    			using (Process proc = new Process())
                {
                    proc.StartInfo.FileName = "/path/打包后的exe名称.exe";
                    proc.StartInfo.Arguments = “exe参数”;
                    proc.StartInfo.RedirectStandardError = true;
                    proc.Start();
                    string error = proc.StandardError.ReadToEnd();
                    proc.WaitForExit();
                }
    

    上述FileName是打包后的exe绝对路径。error是控制台输出的错误信息,如果程序出错的话。

    本人之前的项目HtwMedia(https://blog.csdn.net/u014220286/article/details/88895867)中就用到了这种调用方式,避免了重写python模块带来的繁重工作量。


    作者:Qubook
    出处:http://www.cnblogs.com/hard/
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    联系方式: 个人QQ  1005354833;

  • 相关阅读:
    转------深入理解--Java按值传递和按引用传递
    排序算法 -------未完待续
    eclipse智能提示报错(to avoid the message, disable the...)
    关于hashcode 和 equals 的内容总结
    随笔 软件设计师 -----------考后总结
    wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.
    AvaloniaUI体验
    wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
    wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形
    基于libcurl实现REST风格http/https的get和post
  • 原文地址:https://www.cnblogs.com/Hard/p/csharp-python-pyinstaller.html
Copyright © 2020-2023  润新知