psychopyで作った実験課題ファイルのexe化

学生から「psychopyで作った実験課題を被験者のPCでもすぐにできるようにしたい」と相談を受けたので,

よくあるニーズかなと思い,その対応をまとめたものを公開します。

(現在はテキストのベタ打ちですが,ひまがあればアップデートしていきます。)

さて,相談の中身をざっくり示すと次の通りです。

他のwindowsPCでPythonやpsychopyをインストールすることなく課題を実行する

要は「exe化する」ということですね。

早速やってみましょう!(環境:Win10, python3 from anaconda)

今回は「pyinstaller」というパッケージを使います。

利用法はいくつかweb記事にもあるように,

①インストールする,②pythonスクリプトをつくる,③pyinstallerでexe化する,

の3ステップで簡単にできます。

web記事をみつつ・・・・・・・エラー発生!!!

おそらく多いパターンはpipが機能しないパターンだと思います。

windowsユーザーがPython関連でつまずきやすいところですね。

相変わらずwindowsでのpython作業は初心者にはわかりづらい環境上のエラーが多発します。

anacondaを入れての利用がかなり一般的になってきたので問題は解決しつつありますが,

psychopyを使う(特にbuilder)という目的から入った人には。。。という感じですね。

これを機にぜひanacondaベースにしましょう!

psychopyもアプリ形式(誤解のある表記ですがイメージで)ではなく,

numpyやpandasの一般的な使い方と同様にパッケージをimportして使いましょう。

まずはanacondaをご準備ください。

こちらからご自身のPCにあったものをダウンロードしましょう。

※こだわりがなければ3.xxバージョンを推奨

https://www.anaconda.com/distribution/

すでに使っている人は他の作業に問題がなければパッケージをアップグレードしましょう。

conda update --all

※わかっている人は「--all」ではなく,個別に行ってください。

インストールできたら,「Anaconda Prompt」を起動します。

コマンドプロンプトによく似た画面ですね。

PCの任意の場所に今回作業するフォルダを作ります。

※今回はデスクトップ上に「taskEXE」という名前のフォルダを作ります。

anaconda promptのカレントディレクトリをそこに写します。

「cd C:/Users/(ユーザー名)/Desktop/taskexe」でエンターです。

次の行でそこまでのパス名が出ていると成功です。

次にpsychopyの課題スクリプトを作って,そのフォルダに保存します。

※今回はそれを「test.py」という名前で保存します。

すでに作られている場合はそのpythonファイルをここに入れましょう。

再びanaconda promptで「pip install psychopy」と入力してエンターを押します。

しばらくたってコード実行が完了したら試しに「python test.py」と打ってみましょう。

通常通り,課題がスタートすると思います。

さて,いよいよexe化していきます。

まずは今回のキーとなるpyinstallerをインストールします。

先ほどと同じように「pip install pyinstaller」をanaconda promptで実行します。

それができたら次は「pyinstaller test.py --onefile」を入力します。

しばらく時間がかかります。途中で止まったように感じますが,prompt上に次の「>」が出るまで辛抱強く待ちましょう。

でました・・・!エラーです。

「RecursionError: maximum recursion depth exceeded in comparison」

recursionが上限を突破したようですね。

FFシリーズだと嬉しいですが,今回は余計なことです。

ではrecursionの上限をあげましょう。

このとき,元の環境を変えることができますが今回はpyinstallerで動くファイルを変えると良いです(割と盲点になりがち)。

実行していたフォルダを確認すると,taskEXE内に「dist」「build」フォルダができています。

それとともに,test.specというファイルもあるはずです。

このSPECフォルダを開きましょう(メモ帳とかで十分です)。

この先頭行(ヘッダー(# -*- mode:python; coding: utf-8 -*-)の次の行)に,

import sys

sys.setrecursionlimit(5000)

と書き加えて上書き保存してから閉じます。

この(5000)は任意で変えても結構です。

これで上限数を5000に変更できました。

今度はこのSPECファイルの情報を使ってpyinstallerでEXE化します。

anaconda promptから「pyinstaller test.spec --onefile」を実行します。

またまた時間がかかりますが・・・今度はエラーがなさそうです。

promptにも「Building EXE from EXE-00.toc completed successfully」とあります。

・・・exeファイルなんてどこにもないぞ。

あわてずに,distフォルダ内にできています。

よし,あとはexeファイルを起動するだけ(わくわく)!

ダブルクリックーーー・・・エラー(これは環境次第で起こらない人もいそう)

※バックグラウンドでメッセージがでていることもあるので他のアプリを最小化しておくと気づきやすいです。

「Failed to execute script ○○(スクリプト名:pyi_rth_pkgres等)」

よく見ると,その直前に「」というエラーがでています。

スクリプト内でコンパイルできても実行できないモジュールがあるようです。

※この時,上記の赤文字エラーしか表示されない場合は,buildフォルダにできているwarn-test(*testはpythonスクリプト名).txtを確認しましょう。

ということでimportできるようにしておきましょう。

再び,SPECファイルを開いて「hiddenimports」のところを編集します。

この中身にエラーメッセージに書かれていたパッケージ名を入れます。

参照: https://qiita.com/jokitsu2/items/4020ee85056f3a21c11b

※パッケージ名はクオテーションで囲みましょう

例:No module named 'pkg_resources.py2_warn'の場合

hiddenimports=['No module named 'pkg_resources.py2_warn'] に変更して上書き保存

では,もう一度 「pyinstaller test.spec --onefile」 です。

祈りを込めてエンターを押しましょう。

import情報を含めているので,先ほどより時間がかかります。

→ 完成!!

他のエラーの場合は途中でもご紹介したこちらのリンクをお試しください。

https://qiita.com/jokitsu2/items/4020ee85056f3a21c11b