不能(.exe)我的300行程序使用Cx_freeze或PyInstaller。 (Matplotlib / SciPy的)

时间:2013-12-13 19:54:50

标签: python-2.7 matplotlib scipy pyinstaller cx-freeze

我创建了我的第一个Python程序,我在PyCharm中运行它。

程序有一个GUI,它基本上会弹出一个窗口,有一个目录树,所以用户可以选择一个jpg文件,然后将图像二值化,然后让用户用滑块选择二进制阈值。它还会显示我执行图像转换的其他两个图像。

所以,我的问题是我根本无法将其构建为.exe。我试过Py2Exe,PyInstaller和CX_freeze。我已经尝试在Pyinstaller中构建自己的.spec文件,但都没有成功。

我正在运行2.7.6。我最初安装了64位Python,因此我卸载了与Python相关的所有内容并安装了32位Python。

最初当我使用pyinstaller时,我只会得到ImportError:%1不是有效的Win32应用程序,但是,因为现在构建.spec文件我得到了实际错误。我尝试过使用hooks(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中正确运行。

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题,我通过专门告诉它包含违规模块我在py2exe中修复了它。所以,在setup.py

includes = ['scipy.special._ufuncs_cxx']

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

我和其他几个SciPy模块也发生过这种情况,因此我的includes列表中有大约六个内容。