Исполняемый файл Python build успешно запускается в командной строке conda, но завершается во время выполнения

#python #numpy #tkinter #build #pyinstaller

#python #numpy #tkinter #сборка #pyinstaller

Вопрос:

Вот код,

 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()
  

Я собрал exe-файл с помощью pyinstaller, например

 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 и его тримап 2

Комментарии:

1. Что вы имеете в виду … код продолжает сбоить … , не могли бы вы показать ошибку или более конкретно рассказать о проблеме?

2. сбой означает, что он работает не так, как ожидалось. exe-файл автоматически останавливается и завершает работу приложения.. при запуске в командной строке conda я могу просматривать выходные данные. Но при запуске в Windows он просто завершает работу программы, ошибка не отображается

3. Если код работает в целом, но exe завершается автоматически, то в какой-то части кода может быть ошибка, взгляните на приглашение, чтобы увидеть, в чем ошибка? Имейте в виду, что вам также придется скопировать exe-файл в каталог проекта. иначе, когда вы нажимаете кнопку, путь к изображению недопустим, и, следовательно, это приведет к ошибке и сбою.

4. Я скопировал изображение в каталог сборки, и оно отлично работает с командной строкой conda.. Но при общем запуске ошибка в консоли не отображается.. И просто завершается

5. pyinstaller --hidden-import numpy --hidden-import six --hidden-import='pkg_resources.py2_warn' --hidden-import pymatting main.py попробуйте это?

Ответ №1:

Реальная проблема заключается в том, что pymatting использует функции numpy np.linalg.norm и np.inner , эти два привели к завершению работы приложения реального времени. Я заменил обе функции альтернативами scipy.linalg.norm and manual inner function . Pyinstaller или cx_freeze не будут выполнять эти две функции при сборке приложения. Таким образом, он выходит из строя вне среды командной строки conda

Комментарии:

1. Исправлена ли проблема? Почему pyinstaller не работает с numpy? У меня есть exe, созданный с помощью numpy.linalg . В любом случае попробуйте, pyinstaller --hidden-import numpy --hidden-import six --hidden-import='pkg_resources.py2_warn' --hidden-import pymatting main.py