cx_freeze 不允许我用 librosa Python3 制作 gui

Posted

技术标签:

【中文标题】cx_freeze 不允许我用 librosa Python3 制作 gui【英文标题】:cx_freeze isn't allowing me to make a gui with librosa Python3 【发布时间】:2021-04-01 04:36:38 【问题描述】:

您好 noob python 用户,我正在尝试使用 cx_freeze 和 librosa 音频库制作可执行文件。但是,每次我尝试使用 cx_freeze 制作可执行文件并导入 librosa 库时,可执行文件都不起作用。我可以帮忙吗? 注意:主要代码只是一个调试错误的示例脚本。

这是主要代码,它是示例代码,但导入 librosa。我正在使用此代码 调试,它输出相同的错误。

import PySimpleGUI as sg
import librosa
import IPython as ipd
sg.theme('DarkAmber')   # Add a little color to your windows
# All the stuff inside your window. This is the PSG magic code compactor...
layout = [  [sg.Text('Some text on Row 1')],
            [sg.Text('Enter something on Row 2'), sg.InputText()],
            [sg.OK(), sg.Cancel()]]

# Create the Window
window = sg.Window('Window Title', layout)
# Event Loop to process "events"
while True:             
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'Cancel'):
        break

window.close()

这是我的 cx_Freeze 设置文件

import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = "packages": ["os"], "excludes": [] 

# GUI applications require a different base on Windows (the default is for
# a console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "Billy_Boy",
        version = "01",
        description = "My GUI application!",
        options = "build_exe": build_exe_options,
        executables = [Executable("NACD_Work.py", base=base)])

错误图像 cx_Freeze: cx_Freeze error jpeg

错误图像 pyinstaller

【问题讨论】:

就我个人而言,我使用 pyinstaller 的体验比使用 cx_freeze 顺畅得多,但我可能给出的唯一建议是,您可能需要将一些模块显式添加到由依赖项导入的“包”中 Similar problem including circular import with numba and llvmlite。它可能与不匹配的库版本有关,例如在此 numba 评论中:Your llvmlite<... dependencies introduce circular dependency issues on upgrade. The old numba requires llmvmlite<0.34.0, therefore llvmlite is not upgraded, while the upgrade is necessary to upgrade numba. Always have to force the upgrades with .... @csunday95 所以在 cx_freeze 之前,我使用的是 PyInstaller,我忘了提及。 Pyinstaller/Auto-Py-To-Exe 也不适用于 librosa,cx 在某种程度上给了我关于这个问题的更多信息。我也尝试明确添加一些包,但同样的问题出现了。 这能回答你的问题吗? Circular dependency while executing cx_Freeze result 【参考方案1】:

我设法用 pyinstaller 获得了一个功能强大的可执行文件,但它需要一些工作。不管出于什么原因,pyinstaller 感觉就像完全忽略了 librosa 的存在,即使指定了hidden-import,所以我写了一个自定义钩子:


import os.path
import glob
from PyInstaller.compat import EXTENSION_SUFFIXES
from PyInstaller.utils.hooks import collect_data_files, get_module_file_attribute


datas = collect_data_files('librosa')
librosa_dir = os.path.dirname(get_module_file_attribute('librosa'))
for ext in EXTENSION_SUFFIXES:
    ffimods = glob.glob(os.path.join(librosa_dir, '_lib', f'*_cffi_*ext*'))
    dest_dir = os.path.join('librosa', '_lib')
    for f in ffimods:
        binaries.append((f, dest_dir))

即使这样,我仍然缺少导入,但该导入作为隐藏导入起作用。所以总的来说我得到了代码

import PySimpleGUI as sg
import librosa
import numpy as np
import sys


def main(args):
    test_data = np.zeros(10000)
    test_data[::50] = 1
    print(librosa.beat.tempo(test_data))

    sg.theme('DarkAmber')   # Add a little color to your windows
    # All the stuff inside your window. This is the PSG magic code compactor...
    layout = [  [sg.Text('Some text on Row 1')],
                [sg.Text('Enter something on Row 2'), sg.InputText()],
                [sg.OK(), sg.Cancel()]]

    # Create the Window
    window = sg.Window('Window Title', layout)
    # Event Loop to process "events"
    while True:             
        event, values = window.read()
        if event in (sg.WIN_CLOSED, 'Cancel'):
            break

    window.close()
    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))

使用命令构建功能可执行文件

pyinstaller -F --hidden-import librosa --additional-hooks-dir . --hidden-import sklearn.utils._weight_vector .\test.py

【讨论】:

我删除了之前的评论 所以我去了另一台电脑,在我的笔记本电脑上重新安装了所有东西。在尝试运行 exe 后,我开始收到分发错误,并且分发错误与 PyInstaller 相关……任何可能的见解?我链接了上面的新错误。 所以您在一台计算机上使用 pyinstaller 构建程序后收到上面发布的错误,然后将生成的可执行文件移动到另一台计算机?它是原始问题中的代码,还是一些新代码?您运行什么命令行命令来构建(类似于我的答案的最后一行)?

以上是关于cx_freeze 不允许我用 librosa Python3 制作 gui的主要内容,如果未能解决你的问题,请参考以下文章

运行使用 cx_freeze 编译的 exe 时如何查看错误消息?

cx_Freeze 不工作 - 没有名为 cx_Freeze 的模块

cx_Freeze 错误模块 SSL 不可用 Python 3.7 Windows 10

音频特征提取——librosa工具包使用

如何减少 cx_Freeze 编译的 Python 可执行文件大小?

librosa.clicks 返回的信号不正确