gpt4 book ai didi

python - Pyinstaller - 编译应用程序后找不到libmagic

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:53 24 4
gpt4 key购买 nike

问题

我正在用 Python 编写应用程序。它在我的 python 环境中工作得很好,但是当我用 PyInstaller 编译它并尝试运行生成的可执行文件时,我收到以下错误:ImportError: failed to find libmagic.检查你的安装

我觉得这与“python-magic-bin”有关,该安装包含名为“magic”的模块所需的二进制文件,因为如果我从中卸载“python-magic-bin”我的 Python 环境并尝试运行该应用程序,我得到了完全相同的错误。我认为出于某种原因,这些二进制文件没有被带到编译后的 exe 中。

如果有所不同,我从 .whl 文件安装了“python-magic-bin”。此安装将名为“libmagic”的文件夹 libmagic.dll 和 magic.mgc 添加到安装“magic”的目录中。

问题

如果我对这个问题的看法是正确的,我如何让 PyInstaller 携带“魔法”所需的二进制文件?

重现问题

可以执行以下操作来重现问题:

  1. 将此代码复制并粘贴到您的编辑器中。将其保存为名为“测试.py”

    import magic

    m=magic.MAGIC_NONE
    print(m)
  2. 从此链接下载“python_magic_bin-0.4.14-py2.py3-none-win32.whl”并在解释器中使用以下命令将所需的库安装到 Python 3.6

    >>> pip install pyinstaller
    >>> pip install python-magic
    >>> pip install python_magic_bin-0.4.14-py2.py3-none-win32.whl
    >>> pip install libmagic
  3. 在与“test.py”文件相同的目录中打开命令提示符,然后使用以下命令使用 pyinstaller 编译程序:

    > pyinstaller test.py
  4. 完成后,移动到新创建的/dist/test 目录 (cd ./dist/test) 并运行 .exe 使用:

    > ./test.exe

运行后,您应该会看到一条错误消息:ImportError: failed to find libmagic。检查您的安装无法执行脚本测试

规范文件

这是我用来编译项目的规范文件。

# -*- mode: python -*-

block_cipher = None


a = Analysis(['main.py'],
pathex=['D:\\Home_Python\\pytags'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)

exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=True,
console=True )

coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')

版本

对于这个项目,我使用:

  • python 3.6.3
  • PyInstaller 3.3.1
  • Libmagic 1.0
  • Python-魔术 0.4.15
  • Python-Magic-Bin 0.4.14

最佳答案

几天后我解决了这个问题,所以我将在这里记录我的解决方案,以供将来可能遇到相同问题的任何人使用。

问题在于 libmagic 用于查找正常工作所需的 .dll 文件的方法。

前往 Python 安装下的 Lib/site-packages/magic 并复制名为 magic.py 的文件和名为 libmagic 进入你的 Python 项目目录。完成之后,在您喜欢的 IDE 中打开 magic.py。如果转到第 156 行,您会看到这段代码:

bin_dist_path = os.path.join(os.path.dirname(__file__), 'libmagic')

这是导致我们出现问题的行。它在与 magic.py 文件相同的目录中查找名为 libmagic 的文件夹。具体来说,这里的问题是当文件被卡住到 .exe 文件中时,__file__ 变量的工作方式不同,所以我将 __file__ 替换为 sys.executable 。结果行如下所示:

bin_dist_path = os.path.join(os.path.dirname(sys.executable), 'libmagic')

保存文件,编译程序,然后将 libmagic 文件夹复制到与生成的 .exe 文件相同的目录中。

如果您运行 .exe,现在应该一切正常。

如果有什么我可以澄清的,或者您有任何疑问,请随时提问。

关于python - Pyinstaller - 编译应用程序后找不到libmagic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48000268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com