Pythonはリソースファイルを一緒にexeにパッケージ化して説明します(例があります)

私は前に荷造りすることを学びました。今日、リソースとプログラムをパッケージ化する方法を学びます。
前のチュートリアルリンク:
Pythonはexe実行可能ファイルにパッケージ化されています。チュートリアル
は、Pythonパッケージングのexeファイルが大きすぎるという問題を解決するための仮想環境を確立します。

今日は、リソースファイルをまとめる方法について説明します。

まず、プログラムのコードのリソース部分を追加し、リソースの絶対パスを記述します。パッケージ化されたexeは実行できることを確認しましたが、リソースファイルを移動したときに、パッケージ化されたexeを実行できないことがわかりました。これは確実に機能していません。つまり、exeを他の友達に渡すことはできません。それから私は新しい方法を試しました。
ステップ1:仮想環境を確立し、関連するライブラリをインストールする
このパートでは
、Pythonパッケージングのexeファイルが大きすぎるという問題を解決するための仮想環境の確立について説明します。

ステップ2:リソースフォルダーを作成する
基本原則:Pyinstallerはリソースファイルをexeにバンドルできます。exeが実行されると、一時フォルダーが生成されます。プログラムは、sys._MEIPASSを介して一時フォルダー内のリソースにアクセスできます。

公式の説明:https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation

ステップ3:.pyファイルを
変更するhm_004.pyのコードを変更して、リソースデータパスの部分を読み取ります。

import sys
import os

#生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

#访问res文件夹下数据.txt的内容
filename = resource_path(os.path.join("res","数据.txt"))

hm_004.pyコードは次のとおりです。
コードの変更、パスの読み取り方法が変更されたため、hm_004.pyコードはpycharmなどのプラットフォームで正常に実行できません。何が問題なのですか?パッケージ化されたexenを実行できることが必要です。

#coding:utf-8
import sys
import os

#生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

#访问res文件夹下数据.txt的内容
filename = resource_path(os.path.join("res","数据.txt"))
print(filename)
with open(filename,encoding='utf-8') as f:
    lines = f.readlines()
    print(lines)
    f.close()

ステップ4:パッケージexeの
結果により、ビルド、distフォルダー、specファイルが生成されます。

ステップ5:buildフォルダーとdistフォルダーを削除し、スペック
スペックを変更してメモ帳で開きます。最初にメモ帳を開き、スペックファイルをそこにドラッグします。
変更前のdatas = []の場合、この記事では次の図に変更します。つまり、

hm_004.pyの現在のディレクトリにあるresディレクトリ(およびディレクトリ内のファイル)をターゲットexeに追加し、実行時にゼロタイムファイルのルートディレクトリにresという名前で配置します。

複数のリソースがある場合

datas = [( 'res / bg.jpg'、 'res')、( 'exam.db'、 '。')]
リストにはタプルがあり、左側は追加するファイル名です(相対パスはOK)、右側プロジェクトにコピーした後のフォルダの名前です。
例:( 'res / bg.jpg'、 'res')in'res / bg.jpg 'は、プロジェクトのルートディレクトリのresフォルダーにbg.jpg画像があり、プロジェクトの後にresフォルダーにコピーされることを意味します。
( 'exam.db'、 '。')の 'exam.db'はプロジェクトのルートディレクトリにあるファイルで、 '。'はルートディレクトリを意味します。つまり、プロジェクトのルートディレクトリにコピーされます。
それでも、リソースパスを読み取る方法に注意を払う必要があります。3番目のステップを参照してください。

ステップ6:exeを再度
パックします。今回はspecファイルをパックします。

pyinstaller -F hm_004.spec

buildおよびdistファイルが再度生成されます。新しい仕様はありません

distファイル

ステップ7:exeを実行
するこの記事の例はインターフェースではなく単純なプログラムであるため、直接exeをクリックすると、pyqtなどのインターフェースプログラムではないため、過去に点滅します。
非インターフェイス、Pythonプログラムを実行
し、distフォルダーにcmdを実行して、プログラム名を入力し、Enterキーを押す方法を教えてください。

結果は次のとおりです。ファイルパスが元のdata.txtの絶対パスと異なることがわかりました。

それを他の友達に送って実行してみ
ますresファイルを削除します。
そして、distフォルダーをデスクトップにコピーします(それがインターフェイスプログラムの場合、exeのみをコピーでき
ますデスクトップ上のdistファイル(現時点では、コンピューターにdata.txtリソースファイルがありません。削除したためです)。

再実行:

その他の

実生活では、モデルを含むなど、タスクは一般に非常に複雑です。tensorflowなどをダウンロードする必要があります
一部のパッケージは大きすぎて仮想環境に直接インストールできません。ローカルにダウンロードしてインストールする必要があります。
チュートリアルリンク:python installサードパーティパッケージ

前のチュートリアルと同じパッケージ化手順。違いは、必要なパッケージが多すぎて、パッケージが相互に互換性がないことです。たとえば、パッケージ化にはkerasライブラリが必要であり、Kerasにはtesorflowが必要ですが、パッケージングプロセス中は、テンソルフローのバージョンが2.0より大きくなければなりません。
パッケージ間の互換性の問題は、まさにpythonの欠点です。必要に応じて、パッケージをゆっくりデバッグします。

ここに画像の説明を挿入

電気工学の新しいコンピューター:Yu Dengwu。ブログの投稿を書くのは簡単ではありません。この記事が役に立ったと思われる場合は、高く評価してサポートをお願いします。ありがとうございます。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/kobeyu652453/article/details/108732747