Не могу (.exe) мою 300-строчную программу с помощью Cx_freeze или PyInstaller. (Matplotlib/Scipy)

Я создал свою самую первую программу на Python для работы, и она работает в PyCharm.

Программа имеет графический интерфейс, она в основном открывает окно, имеет дерево каталогов, поэтому пользователь может выбрать файл jpg, затем она бинаризирует изображение, а затем позволяет пользователю выбрать двоичный порог с помощью ползунка. Он также отображает два других изображения, над которыми я выполняю преобразования изображений.

Итак, моя проблема в том, что я вообще не могу собрать его в .exe. Я пробовал Py2Exe, PyInstaller и CX_freeze. Я пытался создать свои собственные файлы .spec в Pyinstaller, но все безуспешно.

У меня 2.7.6. Изначально у меня был установлен 64-битный Python, поэтому я удалил все, что связано с Python, и установил 32-битный Python.

Первоначально, когда я использовал pyinstaller, я просто получал сообщение ImportError: %1 не является допустимым приложением Win32, однако после создания файла .spec теперь я получаю фактические ошибки. Я пытался использовать хуки (hiddenimports=["wx", "scipy", "skimage", "matplotlib", "numpy"]), чтобы убедиться, что все нужные файлы включены, но все равно не повезло.

Основная ошибка, которую я получаю прямо сейчас: Файл "_ufuncs.pyx", строка 1, в init scipy.special._ufuncs(scipy\special_ufuncs.c:19992) ImportError: Нет модуля с именем _ufuncs_cxx

Я также создал меньший код ниже, который просто открывает окно Wx с графиком внутри, но я получаю ту же ошибку.

Как я уже упоминал, я новичок в Python, я много читал и не смог понять это. Я потратил, вероятно, 10-20 часов, просто пытаясь правильно скомпилировать его.

Ниже представлена ​​не моя настоящая программа, а небольшой фрагмент с использованием wxPython и MatPlotLib, который выдает ту же ошибку.

Это пример кода:

import wx
from PIL import Image
import matplotlib
matplotlib.use("WXAgg")
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import     FigureCanvasWxAgg as FigCanvas#,NavigationToolbar2WxAgg as NavigationToolbar
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy
from scipy import interpolate
from matplotlib.backends.backend_wx import NavigationToolbar2Wx


from skimage.filter.rank import entropy
from skimage.morphology import disk
from skimage.util import img_as_ubyte
from skimage import color
from skimage import io
import skimage

from numpy import arange, sin, pi

class CanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigCanvas(self, -1, self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

    def draw(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    fr = wx.Frame(None, title='test')
    panel = CanvasPanel(fr)
    panel.draw()
    fr.Show()

Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "<string>", line 11, in <module>
  File "c:\python27_32bit\lib\site-packages\PyInstaller-2.1-py2.7.egg\PyInstalle\loader\pyi_importers.py", line 270, in
 load_module
    exec(bytecode, module.__dict__)
  File "C:\users\iolvera\PycharmProjects\EL and Grayscale Analyzer\build\compilertest\out00-PYZ.pyz\scipy.interpolate",line 156, in <module>
  File "c:\python27_32bit\lib\site-packages\PyInstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec(bytecode, module.__dict__)
  File "C:\users\iolvera\PycharmProjects\EL and Grayscale Analyzer\build\compilertest\out00-PYZ.pyz\scipy.interpolate.interpolate", line 12, in <module>
  File "c:\python27_32bit\lib\site-packages\PyInstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_importers.py", line 270, in load_module 
   exec(bytecode, module.__dict__)
  File "C:\users\iolvera\PycharmProjects\EL and Grayscale Analyzer\build\compilertest\out00-PYZ.pyz\scipy.special", line 531, in <module>
  File "c:\python27_32bit\lib\site-packages\PyInstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_importers.py", line 409, in load_module
    module = imp.load_module(fullname, fp, filename, self._c_ext_tuple)
  File "_ufuncs.pyx", line 1, in init scipy.special._ufuncs (scipy\special\_ufuncs.c:19992)
ImportError: No module named _ufuncs_cxx

Мой путь Python правильный C:\Python27_32bit\, и у меня также правильно включены \lib\site-packages\ и \DLL.

Как я уже говорил, обе программы корректно работают в PyCharm.

Любая помощь будет принята с благодарностью.

Благодарю вас!


person Isai Olvera    schedule 13.12.2013    source источник
comment
Проблема возникает из-за пустых c-расширений. Надеюсь, это укажет вам правильное направление.   -  person tacaswell    schedule 14.12.2013


Ответы (1)


У меня была эта проблема, и я исправил ее в py2exe, специально указав включить модуль-нарушитель. Итак, в setup.py:

includes = ['scipy.special._ufuncs_cxx']

setup(...,
      options={"py2exe":{"includes":includes}}
     )

У меня это произошло и с парой других модулей SciPy, поэтому в моем списке includes есть около шести вещей.

person jab    schedule 07.03.2014