1.はじめに
boxsdkを使用したpythonアプリの実行ファイルを作成した際に私がかなりつまづいたことについて、備忘録も兼ねて記事を書きます。(初めての記事投稿なので、お手柔らかにお願いいたします)
2.実行環境
Windows11
python : 3.7.9
pyinstaller: 5.8.0
boxsdk : 3.3.0
3.発生したエラー
ターミナルからpythonコマンドで実行する分には何も問題なく処理が行われるのに、実行ファイルを作って実行してみたら何やら以下のようなエラーが出る…
AttributeError: module 'boxsdk.object' has no attribute 'recent_item'
何やらpyinstallerで実行ファイルを作成する際にboxsdkに関連したエラーが起きてそう!
そう思って解決策を探したのですがなかなか見つからず…
やっとの思いで見つけた解決策をここに記載します!!
これは、pyinstallerで実行ファイルを作成する際にboxsdkのモジュールがインポートされていないから起きているエラーのようです。
そのため、ここではpyinstallerで実行ファイルを作成する際にモジュールをインポートする方法をご紹介します!
4.解決策
1. specファイルを作成する
まずはpyinstallerでspecファイルを作成します
pyinstaller (実行したいpythonファイル名) --onefile
例えば、pyinstaller sample.py --onefile
実行が終わるとbuldフォルダとdistフォルダとspecファイルが作成されていると思います。
buildフォルダは実行ファイルの作成に使用するものらしいですがあまり気にしなくて大丈夫です。
distフォルダは作成された実行ファイルが格納されています。
specファイルは、アプリのソースファイル群からrpmパッケージを作成するための指示を記述したファイルです。
2.specファイルのhiddenimportsを編集する
上の手順で作成されたspecファイルを開くと、hiddenimports=[]
という項目があると思います。実行ファイルにboxsdkのモジュールをインポートするために、ここに記入していきます。
hidenimports = [
'boxsdk.object.collaboration',
'boxsdk.object.collaboration_whitelist',
'boxsdk.object.collaboration_whitelist_entry',
'boxsdk.object.collaboration_whitelist_exempt_target',
'boxsdk.object.collection',
'boxsdk.object.comment',
'boxsdk.object.device_pinner',
'boxsdk.object.enterprise',
'boxsdk.object.events',
'boxsdk.object.event',
'boxsdk.object.file',
'boxsdk.object.file_version',
'boxsdk.object.file_version_retention',
'boxsdk.object.folder',
'boxsdk.object.group',
'boxsdk.object.group_membership',
'boxsdk.object.legal_hold',
'boxsdk.object.legal_hold_policy',
'boxsdk.object.legal_hold_policy_assignment',
'boxsdk.object.metadata_cascade_policy',
'boxsdk.object.metadata_template',
'boxsdk.object.recent_item',
'boxsdk.object.retention_policy',
'boxsdk.object.retention_policy_assignment',
'boxsdk.object.search',
'boxsdk.object.storage_policy',
'boxsdk.object.storage_policy_assignment',
'boxsdk.object.terms_of_service',
'boxsdk.object.terms_of_service_user_status',
'boxsdk.object.trash',
'boxsdk.object.task',
'boxsdk.object.task_assignment',
'boxsdk.object.user',
'boxsdk.object.upload_session',
'boxsdk.object.webhook',
'boxsdk.object.watermark',
'boxsdk.object.web_link'
]
boxsdkのモジュール全部をインポートする必要はないと思いますが、何のモジュールが必要かわからなかったので私は全部記入しました。
3. specファイルを使用して実行ファイルの作成
これでboxsdkのモジュールがインポートされた実行ファイルを作成する準備が整いました!
ターミナル上で以下のようなコマンドを実行します。
pyinstaller (specファイル名)
例えば、pyinstaller sample.spec
私の場合はこれでdistフォルダにboxsdkのモジュールがインポートされた実行ファイルが作成され、うまく動作しました!
もし他に必要なモジュールがインポートされていなかったら同じ方法を試してみて下さい!
見ていただき有難うございました!
参考情報