##はじめに
PyQtとOpenCVを使って動画解析のアプリを作って欲しいと言われたけど、肝心の使う人がTerminalって何ですか?という感じ。。
Python,Anacondaなんて当然しらない。。
ということでpythonをEXE化しよう!!と思ったけど大変でした。
Windowsで上手くいった、Anacondaを使った環境構築の手順を書きます。
##Anaconda環境構築
$ conda create -n py36 python=3.6
$ activate py36
完了です。pythonは3.6でなくても3.5でもその後の環境構築は上手くいきました。
##モジュールインストール
$ pip install pypiwin32
$ pip install pyinstaller
$ pip install opencv-python
$ pip install pyqt5
##PyQt5とOpenCVで動画読み込むアプリ作る
ここは各々作ってください。
##PyinstallerでEXE化
pyinstaller 変換ファイル名.py --onefile --debug --clean
エラーなく実行できた!
しかし。。。OpenCVのVideoCaptureで死んでるではないか orz..
いろいろ検索しているとopencv_ffmpeg*_*.dllが必要だとわかった。
ということで、Opencv公式(https://github.com/opencv/opencv/releases/)
からexeファイルをダウンロードして、実行してopencv_ffmpeg340_64.dllを探す。それをPyinstallerでexe化しているファイルがあるdistフォルダに突っ込む!
その状態でexeファイルを実行すると上手く行きました。
##ffmpeg.dllが邪魔、一つにしたい
今のままでも実行できて良いですが、せっかくならffmpeg.dllもまとめてone file化したいです。こちらのスタック・オーバーフローを参考にしました。
変換ファイル名.spec
を以下のように書き換えます。
# -*- mode: python -*-
block_cipher = None
def get_opencv_path():
import cv2
opencv_path = cv2.__path__[0]
return opencv_path
a = Analysis(['変換ファイル名.py'],
pathex=['C:\\path-to-ディレクトリ'],
binaries=None,
datas=[('C:\\~path-to-ffmpeg~\\opencv_ffmpeg340_64.dll','.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
dict_tree = Tree(get_opencv_path(), prefix='cv2', excludes=["*.pyc"])
a.datas += dict_tree
a.binaries = filter(lambda x: 'cv2' not in x[0], a.binaries)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='変換ファイル名',
debug=False,
strip=False,
upx=True,
console=True )
上記のようにffmpegのファイルパスを指定して、specファイルを修正したあとは
pyinstaller 変換ファイル名.spec --onefile
これでexeファイルだけになります。