Ошибка при запуске exe-файла, сделанного с помощью pyinstaller - PullRequest
0 голосов
/ 07 июля 2019

Я попытался сделать автономный исполняемый файл моего скрипта Python с auto-py-to-exe , он в основном обеспечивает простой интерфейс для создания исполняемого файла с помощью pyinstaller, поэтому я сделал exe своего скрипта Python, это консоль на основе и когда я пытаюсь запустить исполняемый файл, который я сделал из моего сценария, то консоль открывается на секунду и быстро закрывается с кучей ошибок. Тем не менее, скрипт отлично работает в режиме ожидания. Я приложил скриншот полученной ошибки. Согласно моим наблюдениям, наиболее вероятно, что ошибка происходит из-за импорта модуля VLC, так как в трассировке ошибок вы увидите, что это произошло из строки 2 и той строки, которую я импортировал VLC. Я также заметил, изменив номер строки импорта для VLC. Я довольно новичок, поэтому мне нужно знать шаги для решения. error trace

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`

1 Ответ

1 голос
/ 07 июля 2019

Python VLC нуждается во внешних зависимостях, таких как DLL, которую вы видите в ошибке.Таким образом, вам нужно добавить их в ваш исполняемый файл с помощью add-data.

Просто скопируйте все *.dll в вашем текущем пути установки VLC (например, C:\Program Files\VideoLAN\VLC), кроме вашего скрипта ииспользуйте команду ниже для генерации вашего исполняемого файла:

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('<path_to_vlc_plugins_dir>', 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
...