1. ホーム
  2. スクリプト・コラム
  3. パイソン

パッケージングツールPyinstallerの使用と落とし穴の回避

2022-01-02 23:30:47

このブログでは、Windowsでのpyinstallerの基本的な使い方と、基本的な落とし穴の回避について書いています。

Windowsでpyinstallerツールを使ってパッケージを作成すると、パッケージ一覧にこのような警告メッセージが表示される問題があります。

ImproperlyConfigured: GDAL ライブラリが見つかりませんでした ("gdal302", "gdal301", "gdal300", "gdal300".Gdal302" を試しました)。quot;, "gdal204", "gdal203", "gdal202", "gdal201", "gdal20") となります。GDALはインストールされていますか?collect_submodules: failed to import 'django.contrib.gis.sitemaps'!

そんなメッセージは無視すればいい。

<スパン I. 基本的な使用方法

1. pyinstallのインストール

# pip install pyinstaller

2. プログラムが必要とするファイルを探す

# Make a .spec file
# Enter the project directory and execute the command: (there are other parameters: -F, etc., -D is recommended)
# -D will create a folder in the current directory in the dist directory, which is more convenient when working with static files
# pyi-makespec -D manage.py

<スパン 3. .exeファイルを生成する

# Execute in the same level as manage.spec
# pyinstaller manage.spec

4. distディレクトリに移動し、プロジェクトを実行する

# generated exe executable runserver --noreload
# manage.exe runserver --noreload

<スパン II. 基本的なエラー処理

1、exe実行後にプロンプトが表示された場合。XXXという名前のモジュールがありません

理由 この状況の理由は、いくつかの Django モジュールは自動的に収集されないため、手動で追加する必要があるためです

回避策 生成されたファイルを拡張子.specで開き、エラーになったモジュールをhiddenimportsに追加します。

2. エラーで実行した場合。UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 658: illegal multibyte.

理由:主にWindowsのgbkエンコーディングの問題

解決方法 エラーメッセージの上の行のエラーファイルを開き、open()で修正するエラー行にジャンプし、そこにencoding='utf-8'を追加してください。

<ブロッククオート

上記例外の処理中に、別の例外が発生しました。

トレースバック (最も最近の呼び出し):
ファイル "threading.py"、ライン 890、in _bootstrap
ファイル "threading.py", 行 936, in _bootstrap_inner
ファイル "traceback.py", 行 167, in format_exc
ファイル "traceback.py", 行 121, in format_exception
ファイル "traceback.py", 行 521, in __init__.
ファイル "traceback.py", 行 533, in _load_lines
ファイル "traceback.py", 行 533, in _load_lines
ファイル "traceback.py", 行 533, in _load_lines
[前の行をさらに2回繰り返す]
ファイル "traceback.py", 行 531, in _load_lines
ファイル "traceback.py", 行 285, in line
ファイル "linecache.py", 行 16, in getline
ファイル "linecache.py", ライン 47, in getlines
ファイル "linecache.py", 行 103, in updatecache
ファイル "PyInstallerloader ⇄pyimod03_importers.py" 行 299, in get_source
UnicodeDecodeError: 'gbk' コーデックは、位置 11211 のバイト 0xa6 をデコードできません: 不正なマルチバイト配列です。

上記はエラー報告の例で、"PyInstallerloader pyimod03_importers.py" ファイルを開き、299行目をコンパイルして、add: encoding='utf-8' に対応する場所を探します (Note: modify the backup before the misuse to avoid find not back)

3、このエラーで実行した場合。TemplateDoesNotExist at /index/ です。

理由 TemplateDoesNotExist これは、テンプレートファイルが見つからなかったためです。

回避策 エラーメッセージに従って、テンプレートファイルを該当パスに追加し、更新してください。

<ブロッククオート

TemplateDoesNotExist at /index/
index/index.html
リクエスト方法 GET
リクエストURL: http://127.0.0.1:8000/index/
Django バージョン: 3.2.9
例外の種類 TemplateDoesNotExist
例外値です。
インデックス/index.html
例外発生場所: djangotemplate⇄loader.py, line 19, in get_template
Python 実行可能ファイルです。F:\WorkspoacePyWork╱Pybookstore╱dist╱manage.exe
Pythonバージョン:3.7.8
Pythonのパス。
['C:\\Users\\\ja\\AppData\\\\Local\\\Temp\\\\_MEI25882\\\base_library.zip',
'C:\\Users\\\ja\\\AppData\\\Local\\\Temp\\\\_MEI25882\\\lib-dynload',
'C:\\Users\\\ja\\\AppData\\\Local\\\Temp\\\_MEI25882']
サーバーの時間です。火曜日、16 11月2021 03:13:35 +0000
テンプレートローダーの後処理
Django はこれらのテンプレートを、この順番で読み込んでみました。

エンジンdjangoを使用。

django.template.loaders.filesystem.Loader.Loader.Loader。C:\UsersjaAppDataLocal﹑Temp﹑MEI25882﹑templates﹑index.html (ソースが存在しません)
django.template.loaders.app_directories.Loader: C:\UsersjaAppData︓Local︓Temp_MEI25882︓django︓templates︓ .html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\UsersjaAppData︓Local︓Temp_MEI25882︓django︓templatesindex.html (ソースが存在しません)

この例では、templates フォルダを C:³³³ にコピーして、以下の場所に置きます。

4、プロジェクトにスタイルCSSとJSが不足している

理由 Pyinstaller はテンプレート(html ファイルファイル)を見つけることができますが、css と js ファイルを見つけることができません。

回避策

設定でdjangoの静的ファイルコレクションを構成する

# STATIC_ROOT = os.path.join(BASE_DIR, 'folder path')

静的ファイル収集コマンド

# python manage.py collectstatic

次に各アプリのurlに追加します。

# static.static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
# This sentence means to copy a static file from the STATIC_ROOT directory to the STATIC_URL path of the web page

静的ファイルのパッケージングを設定するために、.specファイルのdatasを修正します。

# F:\Workspoace\PyWork\bookstore\statics Address of the css, js static files to be packaged Relative to the location of the packaged to dist
# F:\Workspoace\PyWork\bookstore\templates Address of the html file template to be packaged Relative to the location packaged in the dist
# datas=[(r'F:\Workspoace\PyWork\bookstore\statics',r'. \statics'), (r'F:\Workspoace\PyWork\bookstore\templates', r'. \templates')],

注:ここでは、設定テンプレートは3番目のファイルのマイグレーションを行う必要がない上にパッケージ化されており、ここでは同期的にパッケージ化されています。

また、ここでは、django の構成ファイルの設定に小さな問題があります。

# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "statics"),
# ]
STATIC_ROOT = os.path.join(BASE_DIR, 'statics')

STATICFILES_DIRS と STATIC_ROOT は同時に使用できません。STATICFILES_DIRSが設定されている場合、コメントアウトしないとエラーが報告されます。

Pyinstallerのパッケージングツールの使い方と落とし穴の回避についての記事は以上です。Pyinstallerのパッケージングツールの詳細については、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。