用PyInstaller制作的EXE无法加载libvlc.dll(python-vlc)

问题描述 投票:0回答:1

我正在尝试使用 pyinstaller 打包使用 python-vlc 的 python 脚本,但生成的 .exe 拒绝识别 libvlc.dll 二进制文件。我总是遇到同样的错误:

Traceback (most recent call last):
  File "ctypes\__init__.py", line 381, in __init__
OSError: [WinError 193] %1 is not a valid Win32 application

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "vlc-test.py", line 3, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_module
  File "vlc.py", line 210, in <module>
  File "vlc.py", line 170, in find_lib
  File "PyInstaller\loader\pyimod04_ctypes.py", line 55, in __init__
pyimod04_ctypes.PyInstallerImportError: Failed to load dynlib/dll '.\\libvlc.dll'. Most likely this dynlib/dll was not found when the application was frozen.
[2236] Failed to execute script 'vlc-test' due to unhandled exception!

这似乎是其他人通过在规范文件中包含二进制或数据文件来解决的问题。不过,我添加到规范文件中的任何内容都没有任何区别。现在就是这样,我什至还包含了 VLC 所依赖的 Windows 系统 dll:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['vlc-test.py'],
             pathex=["D:\\GitHub\\hours", "C:\\Users\\zacha\\anaconda3\\envs\\hours\\Lib\\site-packages"],
             binaries=[("C:\\Program Files (x86)\\VideoLAN\\VLC\\libvlc.dll","."),
                ("C:\\Program Files (x86)\\VideoLAN\\VLC\\libvlccore.dll","."),
                ("C:\\Program Files (x86)\\VideoLAN\\VLC\\axvlc.dll","."),
                ("C:\\Program Files (x86)\\VideoLAN\\VLC\\npvlc.dll","."),
                ("C:\\Windows\\SysWOW64\\advapi32.dll","."),
                ("C:\\Windows\\SysWOW64\\kernel32.dll","."),
                ("C:\\Windows\\SysWOW64\\MSVCRT.dll","."),
                ],
             datas=[('./libvlc.dll', '.'), ('./axvlc.dll', '.'), ('./libvlccore.dll', '.'), ('./npvlc.dll', '.')],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

a.datas += Tree("C:\\Program Files (x86)\\VideoLAN\\VLC\\plugins", prefix='plugins')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

exe = EXE(pyz,
          a.scripts, 
          [],
          exclude_binaries=True,
          name='vlc-test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas, 
               strip=False,
               upx=True,
               upx_exclude=[],
               name='vlc-test')

二进制文件下列出的所有文件确实出现在 dist 文件夹中,所以我不认为这是格式问题。我使用的是 Python 和 VLC 的 32 位版本。在放弃之前我还能尝试什么吗?

Windows 11、Python 3.8.8、pyinstaller 4.9

python pyinstaller vlc python-vlc
1个回答
0
投票

我看到您已经添加了 libvbc.dll,您是否尝试过以这种方式通过二进制文件添加它?

a.binaries + [("libVLC.dll", "D:\KivySchool\VLC\libvlc.dll", "BINARY")],

也试试

    pathex=["D:\KivySchool\VLC"],

工作中的vlctest.py:

from sys import platform

if platform == "win32": #https://docs.python.org/3/library/sys.html#sys.platform
    import vlc
    import os
    import time

    vlc_player = vlc.MediaPlayer() 
    medianame = "bigbuckbunny x265.mp4"
    mediapath = os.path.join(os.path.dirname(__file__), medianame)
    media = vlc.Media(mediapath)
    vlc_player.set_media(media)
    vlc_player.play()
    offset = 5
    time.sleep(offset)
    length = vlc_player.get_length() #time in ms (divide by 1000 to get in seconds)
    newoffset = length/1000 - offset
    time.sleep(newoffset)

这是适用于 Windows 的工作 .spec 文件,使用 x64 VLC 和 PyInstaller

6.3.0

# -*- mode: python ; coding: utf-8 -*-

medianame = "bigbuckbunny x265.mp4"

a = Analysis(
    ['basicpyvlc.py'],
    pathex=["D:\KivySchool\VLC"],
    binaries=[("D:\KivySchool\VLC\plugins\*", "plugins")],
    datas=[(medianame, ".")],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries + [("libVLC.dll", "D:\KivySchool\VLC\libvlc.dll", "BINARY")],
    a.datas,
    [],
    name='basicvlc',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

示例存储库(因为我花了 3 天让它在 Win 和 Mac 上运行,也确保即使之前未安装 VLC,它们也能运行):https://github.com/AccelQuasarDragon/BasicPyVLC

© www.soinside.com 2019 - 2024. All rights reserved.