【问题标题】:Getting Pyinstaller to recognize the path to Kivy Garden Matplotlib modules让 Pyinstaller 识别 Kivy Garden Matplotlib 模块的路径
【发布时间】: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


【解决方案1】:

我已经通过重新安装 garden.matplotlib

解决了这个问题

你需要使用:

garden install matplotlib --kivy

当您安装没有 --kivy 标签的 garden.matplotlib 时,它会安装在 ~/.kivy/garden/matplotlib文件夹。 Pyinstaller 在那里找不到它。当你设置 --kivy 标签时,它会被全局安装。 Pyinstaller 可以在那里捕获它并自动包含它。

【讨论】:

  • 这解决了我运行“干净”构建后的问题:pyinstaller --clean ....
【解决方案2】:

似乎对安装最有用的解决方案没有解决我的问题,但我找到了如何为我的项目解决它。

matplotlib 与 Kivy 和 Garden 配合得很好的版本是 2.2.5 版本,它不再更新。我改变了一点如何导入 Kivy 后端。

  1. 我在我的虚拟环境中添加了文件夹 name_of_your_venv/Lib/site-packages/matplotlib/backends 中的两个文件 backend_kivy.pybackend_kivyagg.py

  2. 在 matplotlib 库 (name_of_your_venv/Lib/site-packages/matplotlib) 的文件 rcsetup.py 中,我更改了交互式后端的名称列表,添加了 'Kivy''KivyAgg'(文件的第 43 行)

    interactive_bk = ['GTK', 'GTKAgg', 'GTKCairo', 'GTK3Agg', 'GTK3Cairo',
                      'MacOSX',
                      'nbAgg',
                      'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt5Cairo',
                      'TkAgg', 'TkCairo',
                      'WebAgg',
                      'WX', 'WXAgg', 'WXCairo',
                      'Kivy', 'KivyAgg']
    
  3. 最后一步是更改项目中的导入

    import matplotlib
    matplotlib.use('Kivy')
    

当你使用 PyInstaller 时,它会直接从你的 venv 的 matplotlib 库中获取文件,而不是从隐藏的导入中获取。

这个解决方案对我有用。希望对你也有帮助。

【讨论】:

    【解决方案3】:

    您应该在.spec 文件中将'~/kivy/garden/matplotlib' 添加到其pathhex

    并更改hiddenimports=['backend_kivy']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2021-05-12
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多