【发布时间】:2017-05-04 20:15:11
【问题描述】:
这类似于:Kivy Garden in PyInstaller - stuck trying to trace import,除了我将提供更多细节以希望让某人更容易测试并提供具体解决方案....
我已经使用 Kivy 1.9.1 构建了一个 Python 2.7.13 应用程序,并正在尝试使用 Pyinstaller 在 Windows 10 中为 Windows 打包它。简而言之 - 我无法让 Pyinstaller 获取 Garden 模块 - 特别是我用来显示数据的 matplotlib 模块。这个花园模块是通过以下方式安装的:
garden.bat install matplotlib
我的应用程序太大且太复杂,无法在此处发布,因此我在网上找到了一个示例,其中包含尝试导入和使用模块的方式与我正在执行的方式基本相同。这是 Python 文件,从 Python 解释器运行时可以正常工作:
import matplotlib
matplotlib.use('module://kivy.garden.matplotlib.backend_kivy')
from matplotlib.figure import Figure
from numpy import arange, sin, pi
from kivy.app import App
import numpy as np
from matplotlib.mlab import griddata
from kivy.garden.matplotlib.backend_kivy import FigureCanvas,\
NavigationToolbar2Kivy
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from matplotlib.transforms import Bbox
from kivy.uix.button import Button
from kivy.graphics import Color, Line, Rectangle
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
fig, ax = plt.subplots()
X = np.arange(-508, 510, 203.2)
Y = np.arange(-508, 510, 203.2)
X, Y = np.meshgrid(X, Y)
Z = np.random.rand(6, 6)
plt.contourf(X, Y, Z, 100, zdir='z', offset=1.0, cmap=cm.hot)
plt.colorbar()
ax.set_ylabel('Y [mm]')
ax.set_title('NAILS surface')
ax.set_xlabel('X [mm]')
canvas = fig.canvas
def callback(instance):
global fig, ax
X = np.arange(-508, 510, 203.2)
Y = np.arange(-508, 510, 203.2)
X, Y = np.meshgrid(X, Y)
Z = 1000*np.random.rand(6, 6)
plt.clf()
plt.contourf(X, Y, Z, 100, zdir='z', offset=1.0, cmap=cm.hot)
plt.colorbar()
canvas.draw()
class MatplotlibTest(App):
title = 'Matplotlib Test'
def build(self):
fl = BoxLayout(orientation="vertical")
a = Button(text="press me", height=40, size_hint_y=None)
a.bind(on_press=callback)
fl.add_widget(canvas)
fl.add_widget(a)
return fl
if __name__ == '__main__':
MatplotlibTest().run()
Pyinstaller 和 Python 解释器都放在我的 windows 路径中,所以当我通过 Windows Powershell 将上述文件(名为 mplTest.py)传递给 Python 解释器时,就像
python mplTest.py
一切都像一个魅力。但是,尝试用命令打包这个:
pyinstaller mplTest.py
按预期生成 ./dist/ 和 ./build/ 目录,以及 pyinstaller 规范文件。如果我导航到 ./dist/mplTest/ 目录并尝试运行文件 mplTest.exe(由 pyinstaller 生成的可执行文件),我会在日志消息中收到以下内容:
[WARNING ] stderr: Traceback (most recent call last):
[WARNING ] stderr: File "mplTest.py", line 10, in <module>
[WARNING ] stderr: ImportError: No module named garden.matplotlib.backend_kivy
我尝试使用以下方法修改 .spec 文件中的 hidden_imports:
hiddenimports=['garden.matplotlib.backend_kivy'],
但是当尝试使用 pyinstaller 编译 .spec 文件时,我最终得到了这条线:
362 ERROR: Hidden import 'garden.matplotlib.backend_kivy' not found
有人可以在这里提出建议吗?提到的链接 SO 线程中的一位用户使用:
garden.bat install --app matplotlib
创建一个 ./libs/garden/ 目录来安装这些,所以也许有人可以告诉我如何从规范文件中链接到这些?
我真的很反对这个问题,投入如此多的开发时间却被困在可能如此微不足道的事情上是很痛苦的……如果有必要,我很乐意提供更多信息。
提前致谢。
【问题讨论】:
-
凹凸。有人,有人吗?我知道有人必须使用带有 pyinstaller 的花园模块打包一个 kivy 应用程序......
-
问题解决了吗?我对这个话题很感兴趣,同样的问题。
-
我没有 - 我最终只是在我为其编写软件的用户的少数工作站上安装了我需要的完整 Python 堆栈 - 性能更好,我不需要隐藏无论如何来源。如果你弄明白了,请告诉我。
标签: python matplotlib kivy pyinstaller