Kev*_*ian 3 python pyinstaller python-3.x libmagic python-3.6
我正在用 Python 编写一个应用程序。它在我的 python 环境中运行良好,但是当我使用 PyInstaller 编译它并尝试运行生成的可执行文件时,我收到以下错误:ImportError: failed to find libmagic. Check your installation
我有一种感觉,这与“python-magic-bin”有关,该安装包含名为“magic”的模块所需的二进制文件,因为如果我从 Python 环境中卸载“python-magic-bin”并尝试运行该应用程序,我得到了完全相同的错误。我认为由于某种原因,这些二进制文件没有被带到编译的 exe 中。
如果它有所作为,我从 .whl 文件安装了“python-magic-bin”。此安装在安装“magic”的目录中添加了一个名为“libmagic”的文件夹 libmagic.dll 和 magic.mgc。
如果我的问题是正确的,我如何让 PyInstaller 携带“魔法”需要的二进制文件?
可以执行以下操作来重现问题:
将此代码复制并粘贴到您的编辑器中。将其另存为名为“test.py”的文件
import magic
m=magic.MAGIC_NONE
print(m)
Run Code Online (Sandbox Code Playgroud)从此链接下载“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
Run Code Online (Sandbox Code Playgroud)在与“test.py”文件相同的目录中打开命令提示符,并使用以下命令使用 pyinstaller 编译程序:
> pyinstaller test.py
Run Code Online (Sandbox Code Playgroud)完成后,移动到新创建的 /dist/test 目录 ( cd ./dist/test
) 并使用以下命令运行 .exe:
> ./test.exe
Run Code Online (Sandbox Code Playgroud)运行后,你应该看到一个错误读数:ImportError: failed to find libmagic. Check your installation
和Failed to execute script test
规格文件
这是我用来编译我的项目的规范文件。
# -*- 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')
Run Code Online (Sandbox Code Playgroud)
对于这个项目,我正在使用:
几天后我解决了这个问题,所以我将在这里记录我的解决方案,以供将来可能遇到相同问题的任何人使用。
问题是libmagic
用于查找正常工作所需的 .dll 文件的方法。
转到Lib/site-packages/magic
Python 安装下,并将名为的文件magic.py
和名为的文件夹复制libmagic
到 Python 项目的目录中。完成后,magic.py
在您喜欢的 IDE 中打开。如果您转到第 156 行,您将看到以下代码:
bin_dist_path = os.path.join(os.path.dirname(__file__), 'libmagic')
Run Code Online (Sandbox Code Playgroud)
这是导致我们问题的线路。它在与magic.py
文件相同的目录中查找名为 libmagic 的文件夹。具体来说,这里的问题是__file__
当文件被冻结为 .exe 文件时,该变量的工作方式不一样,所以我__file__
用sys.executable
. 结果行如下所示:
bin_dist_path = os.path.join(os.path.dirname(sys.executable), 'libmagic')
Run Code Online (Sandbox Code Playgroud)
保存文件,编译程序,然后将libmagic
文件夹复制到与生成的 .exe 文件相同的目录中。
如果您运行 .exe,现在应该一切正常。
如果有什么我可以澄清的,或者您有任何疑问,请随时提出。
归档时间: |
|
查看次数: |
1362 次 |
最近记录: |