首页 > 解决方案 > Python 构建 exe 文件在 conda 提示符下成功运行,但在运行时退出

问题描述

这是代码,

from pymatting import *
#import numpy as np
import tkinter as tk
root = tk.Tk()


def func():
    print( "before matting")
    scale = 1
    print( "1")
    image = load_image(r"s.png", "RGB", scale, "box")
    trimap = load_image(r"tri.png", "GRAY", scale, "nearest")
    print( "2")
    # estimate alpha from image and trimap
    alpha = estimate_alpha_knn(image, trimap)
    
    print( "3")
    # estimate foreground from image and alpha
    foreground = estimate_foreground_ml(image, alpha, return_background=False)
    print( "4")
    # save cutout
    cutout = stack_images(foreground, alpha)
    
    save_image("2_out.png", cutout)   
    print( "saved")
    
button = tk.Button(root, text = "start",command =func) 
button.pack() 
root.mainloop()

我已经使用 pyinstaller 构建了 exe,例如

pyinstaller --hidden-import six --hidden-import='pkg_resources.py2_warn' --hidden-import pymatting main.py

它成功构建,并且在 conda 提示符下使用./main.exe我可以查看输出..

但是当 main.exe 直接使用 windows 打开时,此代码一直失败。它在执行时退出..程序退出而不显示任何错误..

(我认为 numpy 函数的线性求解方程没有包含在构建中,例如我的分析中的 numpy.inner 或 numpy.linalg 等,如果我错了,抱歉)

建议我解决这个问题的方法。这是原始图像1和它的 trimap 2

标签: pythonnumpytkinterbuildpyinstaller

解决方案


真正的问题是 pymatting 用于 numpy 函数np.linalg.normnp.inner这两个导致实时应用程序退出。我用替代品替换了这两个功能scipy.linalg.norm and manual inner function。Pyinstaller 或 cx_freeze 在构建应用程序时不会使用这两个函数。所以它在 conda 提示环境之外失败了


推荐阅读