質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.06%

  • Python 3.x

    3700questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

vlcとPyQt5を用いたプログラムのPyInstallerによるexe化がうまくいきません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 283

Goo_MD

score 3

前提・実現したいこと

Python初学者です。
練習としてPyQt5とvlcを用いたMP3プレーヤを作っています。
せっかくなのでexe化してみようと思いPyInstallerを使ってみたのですが、うまくいきません。
ビルド時のコンソールでの命令文は以下の通りです。

pyinstaller testGui.py -p "C:\Users\ma8wi\Anaconda3\envs\py35\Lib\site-packages\PyQt5\Qt\bin" -p "C:\Program Files\VideoLAN\VLC"


インポートしているモジュールは以下の通りです。

import sys
import os
import vlc
import keyboard
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from dateutil.relativedelta import relativedelta
import pyperclip as clip


生成されたexeファイルを実行した結果のエラーメッセージは以下の通りです。

Traceback (most recent call last):
  File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line 149, in __init__
  File "ctypes\__init__.py", line 351, in __init__
OSError: [WinError 126] 指定されたモジュールが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "testGui.py", line 11, in <module>
  File "<frozen importlib._bootstrap>", line 968, in _find_and_load
  File "<frozen importlib._bootstrap>", line 957, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "c:\users\ma8wi\anaconda3\envs\py35\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\vlc.py", line 198, in <module>
  File "site-packages\vlc.py", line 169, 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 probably this dynlib/dll was not found when the application was frozen.
[3156] Failed to execute script testGui


ビルド時のwarningは以下の通りです。

missing module named resource - imported by posix, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named posix - imported by os, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named _posixsubprocess - imported by subprocess, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named 'org.python' - imported by pickle, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py, xml.sax
missing module named ce - imported by os, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named readline - imported by cmd, code, pdb, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
excluded module named _frozen_importlib - imported by importlib, importlib.abc, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named _frozen_importlib_external - imported by importlib._bootstrap, importlib, importlib.abc, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named _winreg - imported by platform, vlc, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named _scproxy - imported by urllib.request
missing module named java - imported by platform, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named 'java.lang' - imported by platform, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py, xml.sax._exceptions
missing module named vms_lib - imported by platform, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named termios - imported by tty, vlc, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py, getpass
missing module named grp - imported by shutil, tarfile, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named _dummy_threading - imported by dummy_threading, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named org - imported by copy, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py
missing module named pwd - imported by posixpath, shutil, tarfile, http.server, webbrowser, C:\Users\ma8wi\Documents\Python Scripts\testAudio\testGui.py, netrc, getpass
missing module named AppKit - imported by keyboard._darwinkeyboard, pyperclip
missing module named Foundation - imported by pyperclip
missing module named PyQt4 - imported by pyperclip
missing module named qtpy - imported by pyperclip
missing module named gtk - imported by pyperclip
missing module named StringIO - imported by six
missing module named Quartz - imported by keyboard._darwinkeyboard
missing module named fcntl - imported by keyboard._nixcommon
missing module named Queue - imported by keyboard, keyboard._nixcommon, keyboard._generic

試したこと

exe化する際にうまくvlcが取り込めていないのか?と思い、vlcを使わないプログラムをexe化してみました。この場合にはうまく動いきました。

補足情報(言語/FW/ツール等のバージョンなど)

環境は以下の通りです。
・Windows10
・Anaconda 3.3.30
・Python3.5.4
・PyInstaller3.3

初心者ながら、libvlc.dllがうまく見つけられていないのでは?と感じているのですが、対策が全くわかりません。
解決策に心当たりがある方いましたら、よろしくお願いします。
(質問自体初めてなので、情報が不足しているかもしれません、ご指摘いただければ追加します。)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YouheiSakurai

    2017/12/10 23:34

    質問のコツは上手くいかないところを事細かに説明することです。エラーメッセージ等もあると良いと思います。

    キャンセル

  • Goo_MD

    2017/12/10 23:48

    わからないながら、情報を追加してみました。よろしくお願いします。

    キャンセル

回答 2

check解決した方法

+1

下記2つのリンク先を参考にして自己解決いたしました。
Sign up  New issue ctypes - loading external DLL (not bundled) fails #1685
Recipe Win Load External DLL

以下のコードをexe化しようとしている.pyファイル(私の場合はtestGui.py)の冒頭に追加することで解決しました。

import ctypes
import os
import sys

# Override dll search path.
ctypes.windll.kernel32.SetDllDirectoryW(YOUR_PATH_WITH_EXTERNAL_DLL) # 私の場合は"C:\Program Files\VideoLAN\VLC"
# Init code to load external dll
ctypes.CDLL('library.dll') #vlcを読み込ませたいのでlibvlc.dll
# ...
# Restore dll search path.
ctypes.windll.kernel32.SetDllDirectoryW(sys._MEIPASS)

正直このコードが一体何をしているのか、全くわかりませんがうまく動いたので記録として残します。
(おそらくlibrary.dllをバンドルするのではなく、参照先を指定しているのだと思います。なのでvlcがインストールされていない環境ではきっと動かないのではないかと思います)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ご推察の通り、exe化する際にうまくvlcが取り込めていないはずです。
外部ファイルはPathを追加し、意図的にexeにbundleさせる必要があるようです。

おそらくこちらに書かれている内容で修正ができると思います(私も同様でしたので)。

pyinstallerの*.specファイル作成法。
https://qiita.com/cheuora/items/39b3203400e1e15248ed

webサイト内で書かれているspecファイルは、pyinstallerでexe化処理する際に作成されていると思います。そのファイルをベースに編集すると良いと思います。

■作成環境
Win,Mac : Python3.5.2 / PyInstaller3.2.1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/12 00:09 編集

    教えていただきありがとうございます。
    せっかくリンクを張っていただいたのですが、リンク先の方法ではうまくいきませんでした・・・
    別のページを参考にして自己解決しましたので、まとめます。

    教えていただきありがとうございました。

    キャンセル

  • 2017/12/12 10:02

    レスありがとうございます。
    インストールされたソフトのDLLの場合は手法が違うのですね。ためになりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    3700questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。