Pyinstaller - 编译app

时间:2017-12-28 00:42:19

标签: python python-3.x python-3.6 pyinstaller libmagic

问题

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

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

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

问题

如果我对这个问题是正确的,我如何让PyInstaller继承“神奇”需要的二进制文件?

重新创建问题

可以执行以下操作来重新创建问题:

  1. 将此代码复制并粘贴到编辑器中。将其另存为名为的文件 “test.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
    
  5. 运行后,您会看到错误消息:ImportError: failed to find libmagic. Check your installationFailed to execute script test

    规范文件

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

    # -*- 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-Magic 0.4.15
    • Python-Magic-Bin 0.4.14

1 个答案:

答案 0 :(得分:3)

几天之后我就把这个问题弄清楚了,所以我将在这里为那些可能在将来遇到同样问题的人记录我的解决方案。

问题是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,现在一切都应该正常运行。

如果有什么我可以澄清或有疑问,请不要犹豫。