运行使用pyinstaller制作的exe文件时出错

Posted

技术标签:

【中文标题】运行使用pyinstaller制作的exe文件时出错【英文标题】:Error while running the exe file made with pyinstaller 【发布时间】:2019-11-17 01:56:10 【问题描述】:

我尝试使用 auto-py-to-exe 制作我的 python 脚本的独立可执行文件,它基本上为使用 pyinstaller 创建可执行文件提供了简单的界面,所以我制作了我的 python 脚本的 exe,它是基于控制台的,当我尝试运行该 exe 时我编写了我的脚本,然后控制台打开了一秒钟,然后很快就出现了一堆错误。但是,该脚本在空闲时运行良好。 我附上了我收到的错误的屏幕截图。根据我的观察,错误很可能是由于 VLC 模块的导入而发生的,因为在错误跟踪中,您将看到它发生在第 2 行并且我已导入 VLC 的那一行。我还通过更改 VLC 的导入行号来观察。 我是一个初学者,所以我需要知道解决方案的步骤。

from bs4 import BeautifulSoup
import vlc
import pafy
import urllib.request
import time


textToSearch = 'tremor dimitri vegas ' 
query = urllib.parse.quote(textToSearch)
urlq = "https://www.youtube.com/results?search_query=" + query
response = urllib.request.urlopen(urlq)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
track_links=[]
i=0
for vid in soup.findAll(attrs='class':'yt-uix-tile-link'):
    i=i+1
    print('https://www.youtube.com' + vid['href'])
    track_links.append('https://www.youtube.com' + vid['href'])
    if i==2:
        break
print()


url = track_links[1]
video = pafy.new(url)
best = video.getbestaudio()
playurl = best.url
ins = vlc.Instance()
player = ins.media_player_new()

code = urllib.request.urlopen(url).getcode()
if str(code).startswith('2') or str(code).startswith('3'):
    print('Stream is working and playing song')
else:
    print('Stream is dead')

Media = ins.media_new(playurl)
Media.get_mrl()
player.set_media(Media)
player.play()

time.sleep(20)
player.stop()#breaking here just for check purpose

现在这里是完整的错误跟踪

`Traceback (most recent call last):
 File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line   149, in _
 _init__
 File "ctypes\__init__.py", line 348, in __init__
 OSError: [WinError 126] The specified module could not be found

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
 File "liveyoutbe.py", line 2, in <module>
 File "<frozen importlib._bootstrap>", line 961, in _find_and_load
 File "<frozen importlib._bootstrap>", line 950, in  _find_and_load_unlocked
 File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
 File "c:\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
 line 627, in exec_module
 exec(bytecode, module.__dict__)
 File "site-packages\vlc.py", line 207, in <module>
 File "site-packages\vlc.py", line 163, in find_lib
 File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line  151, in _
_init__
 __main__.PyInstallerImportError: Failed to load dynlib/dll 'libvlc.dll'. Most pr
 obably this dynlib/dll was not found when the application was frozen.
 [6032] Failed to execute script liveyoutbe`

【问题讨论】:

请发布您的代码并在 cmd 中打开 exe 并将 traceback 作为文本放在这里。 我已经编辑了问题并添加了代码以及错误跟踪,请帮助我是初学者 【参考方案1】:

Python VLC 需要外部依赖项,例如您在错误中看到的 DLL 文件。因此,您需要使用add-data 将它们添加到您的可执行输出中。

只需将您当前 VLC 安装路径(例如 C:\Program Files\VideoLAN\VLC)中的所有 *.dll 复制到您的脚本中,然后使用以下命令生成您的可执行文件:

pyinstaller.exe -F --add-data "./libvlc.dll;." --add-data "./axvlc.dll;." --add-data "./libvlccore.dll;." --add-data "./npvlc.dll;." script.py

编辑:您似乎还需要一个依赖项,即plugins 目录。只需将 VLC 路径中的整个插件目录添加到可执行输出即可。为此,在执行上述命令后,您将获得一个规范文件,将 a.datas += Tree('&lt;path_to_vlc_plugins_dir&gt;', prefix='plugins') 添加到文件中,如下所示:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['script.py'],
             pathex=['<root_project_path>'],
             binaries=[],
             datas=[('./libvlc.dll', '.'), ('./axvlc.dll', '.'), ('./libvlccore.dll', '.'), ('./npvlc.dll', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

a.datas += Tree('<path_to_vlc_plugins_dir>', prefix='plugins')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='script',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

最后,执行这个:

pyinstaller script.spec

【讨论】:

嘿,正如你所说,我试图添加所有必需的文件并制作 exe。但是当我运行可执行文件时它运行了一段时间(执行程序的一半)并再次以错误C:\Users\intel\Desktop&gt;liveyoutbe.exe https://www.youtube.com/watch?v=9vMh9f41pqE https://www.youtube.com/watch?v=jVrB_vfS3AQ Traceback (most recent call last): File "liveyoutbe.py", line 34, in &lt;module&gt; player = ins.media_player_new() AttributeError: 'NoneType' object has no attribute 'media_player_new' [5172] Failed to execute script liveyoutbe结束 并且似乎程序运行了一段时间,但现在仍然没有导入 vlc 模块! 我测试了这个答案并为我工作。请记住,此解决方案仅用于导入 VLC。但是您的代码似乎有错误,这意味着这是一个不同的问题。 谢谢哥们!!现在它工作正常,在添加了我在网上搜索的 dll 文件后,我发现我也需要添加 VLC 的插件文件夹和你在答案中描述的一样,所以我没有修改规范文件,而是使用--add-data最后代码很高。再次感谢您节省了我的时间。我完全糊涂了 @Kartikeya 如果您安装了upx,PyInstaller 将使用它来压缩可执行文件。

以上是关于运行使用pyinstaller制作的exe文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

PyInstaller:尝试运行分发文件时出现 FileNotFoundError

PyInstaller 问题制作使用转换器和 PyQt5 库的 exe 文件

Pyinstaller 可执行文件不起作用

pyinstaller的使用

使用 Pyinstaller 制作的 Python Exe 试图从错误的位置找到 dll

python制作一键启动脚本