PyQt5初心者テストレコード(3):Pyinstallerパッケージの概要

序文:このレコードは、作成者の自習プロセス中の簡単なメモです。ライブラリのインストールから最終的に.exeにパッケージ化するまでのプロセスを説明します。初心者が参照および交換できるように、3つのパートに分かれています。説明にエラーがある場合は、読者にお問い合わせください。アドバイスとして、リストの3番目の部分を以下に示します。

1つは、Pyinstallerのパッケージ化プロセス

私は以前にPyQt5に基づいてツールを作成しました(詳細については、PyQt5の初心者テストレコードを参照してください。Python関連の環境なしで他のコンピューターで実行するには、.exeファイルにパッケージ化する必要があります。多くの情報を検索した後、使いやすいpyinstallerをお勧めします。 。しかし... TATの実際の経験は非常に貧弱で、おそらく個人の才能と学習の不足が原因で、さまざまな小さな問題の解決が遅れています。ニーズが基本的に満たされたら、要約とレビューを書く時間です。

最初にpyinstallerをインストールし、コマンドラインにコマンドを入力します。

pipインストールpyinstaller

インストールが完了し、成功したことが表示されたら、パッケージング作業を開始して、コマンドラインに次のように入力できます。

cd / dドライブ文字:\パッケージ化されたファイルのディレクトリ

パッケージ化されたxxx.pyファイルが置かれているディレクトリ(e:\ filepathなど)を入力し、次のように入力します。

pyinstaller -w -D xxx.py

-wこれは、パッケージ化された.exeがシェルウィンドウなしで実行-Dされることを意味します。これは、.exeと他の関連ファイルを含むディレクトリまたはフォルダーにパッケージ化されることを意味します。通常、複数のディレクトリと複数のファイルを持つプロジェクトは、この方法でパッケージ化されます。単一の.py -Fパラメータ;

パッケージ化が完了すると、buildとdistの2つのフォルダー、およびxxx.specファイル(パッケージ化ルールの構成に使用)xxx.pyルートディレクトリに生成され、生成された.exeはdistのサブディレクトリに生成されます。間違いがないことを確認する前に、.exeを直接ダブルクリックする代わりに、コマンドラインから呼び出すことをお勧めします。これにより、エラーが発生したときにプログラムがクラッシュするのを防ぎ、デバッグを容易にするためにエラー情報をシェルに表示できます。
【図1】

xxx.spec変更した後、再度実行ます

pyinstaller -w -D xxx.spec

2.パッケージングで発生した問題(完全には解決されていません)

考えられる問題を見てみましょう:

1、名前の付いたモジュールはありません

Pyinstallerはパッケージ化時にxxx.pyの依存関係を自動的に検索しますが、愚かな操作には常に欠陥があります。それでも必要なものが見つからない場合があります。現時点では、上記の構成ファイルxxxが使用されます。 spec、ファイルを変更するためのAnalysisメソッドは次のとおりです。

a = Analysis(['MainFunction.py',
              'E:\\NewSysCrawler\\GUI_Call\\MyCrawler.py',
              'E:\\NewSysCrawler\\GUI_Call\\getdetails.py',
              'E:\\NewSysCrawler\\GUI_Call\\getbase.py',
              'E:\\NewSysCrawler\\QtFile\\getXlsxWidget.py',
              'E:\\NewSysCrawler\\QtFile\\mainWidget.py'],
             pathex=['E:\\NewSysCrawler','E:\\NewSysCrawler\\venv\\Lib\\site-packages'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

最初の[]はパッケージ化されたxxx.py(作成者はMainFunction.pyです)であり、引き続きプロジェクト内の他の.pyファイルのパスを追加します\\区切り文字は二重スラッシュであることに注意してください2番目のpathexは、パッケージ化時の検索パスです。プロジェクトが依存するライブラリのパスを追加します。また、データはプロジェクトで使用されるその他のファイルデータ(またはサードパーティの.dll)です。作成者は他の関連付け方法を使用したため、データは入力されていません。このようにして、問題の最初の波を解決する必要があります。

2、そのようなファイルやディレクトリはありません

プログラムの実行に関連するローカルファイル(作成者のクローラーツールで必要なCookieなどは、ローカル.txtから履歴を読み込みます)。データに設定がない場合、この問題が発生する可能性があります。作成者の解決策は、必要なファイルを直接置くことです(フォルダー)生成されたルート.exeで、指定されたパス(.\Filesルートディレクトリフォルダー内のFilepath .exeファイル..\OtherFilesからフォルダーの親ディレクトリ内の別の.exeファイルなど)に注意してください。

3、許可拒否

これまでの編集で、著者はこのエラーが発生した状況を忘れてしまいました...それは不可解に解決されました。権限が不足しているようです。作成者のクローラーツールがクロールされたデータの.txtを指定されたディレクトリに出力すると推測されますが、それが配置されているディレクトリは存在しません。コードを変更してディレクトリを作成できます(または上記のデータで解決する必要があります)):

result =str(html.text) # 爬虫获取的内容
dirs = '..\\OtherFiles'
if not os.path.exists(dirs): # 判断目录是否存在,不存在则创建
    os.mkdir(dirs) # 
# open无法打开/创建不存在的目录,但可以自动新建.txt 
with open(dirs+"\\"+txt,'a',encoding="utf-8-sig") as file_handle:      
    file_handle.write(result)   # 写入

4、開梱するには値が不十分です

pyinstallerによって入力されたパラメーター形式を確認してください。

5. .exeのアイコンが異常に表示される

Pyinstallerの最も厄介な問題は、アイコンの設定に特定の要件があり、Windowsシステム自体にもアイコンの要件があることです(ただし、これまでのところ詳細はわかりません...)、作者は繰り返し試してみましたが、パッケージング時に使用される目的の効果を達成できませんでしたパラメータは次のとおりです。

pyinstaller -w -D xxx.py -ie:\ icons \ myIcon.ico

Pyinstallerはアイコンを設定するための.icoファイルのみを処理できます。次のコードは、さまざまなサイズのアイコンファイルを一度に生成できます(またはPng2Ico、Format Factoryなどのツールを使用するか、アイコンのWebサイトからダウンロードします)。

from PIL import Image

image_size = [128,64,48,32,16]
def create_icon():
    for size in image_size:
        pri_image = Image.open("Icon.png")
        pri_image.resize((size, size), Image.ANTIALIAS).save("Icon_%d.ico" % (size))

if __name__ == "__main__":
    create_icon()

生成された.exeのアイコンはまだ表示されません必ずしも成功するわけではありません)。そのため、ショートカットに切り替えて手動でアイコンを変更しましたが、他のコンピューターではショートカットが無効になりました。その後、作成者はランチャーを作成しようとしました。具体的には、以前に生成された.exeを呼び出すために使用され、コードは次のとおりです。

import os

def main():
    os.chdir(".\\NewSysCrawler20.4.23") # 更改工作目录
    os.system('NSCrawler.exe') # 执行

if __name__ == "__main__":
    main()

os.system().exeシェルウィンドウの実行中にopenを使用し、次に切り替えます。

subprocess.call('NSCrawler.exe')

また、pyinstallerを使用してランチャーの.pyをパッケージ化し、ランチャーをパッケージ化するときにアイコンを設定します(アイコンが正常に表示されます!)。最後に、元のパッケージディレクトリにある元のツールのNSCrawler.exeを呼び出すためにrunNSC.exeが使用される状況になります。
【図2】

この時点で、アイコンの問題はほとんど解決されていません(後でパッケージ化された単一ファイルが成功しているように見えることがわかりました...)。

また、アイコン描画ツールであるGreenfish Icon Editor Proをお勧めします。自分でパターンを設計したい場合は、試してみてください(筆者のクローラーツールアイコンは、もともとsaiが描いた爪でした)。

6、ウイルス対策ソフトウェアの誤検知

おそらくos操作のために、コードを最適化する方法を考えてください!

7.互換性

64ビットPythonで記述されたプログラムは、パッケージ化した後は他の64ビットコンピューターでのみ実行でき、32ビットコンピューターは実行できますが、XP / 7/10などの別のシステムでも問題が発生する可能性があります(根本的な原因がわからない)。

3、Pycharmプロジェクトの移行について

パッケージ化と公開に加えて、プロジェクト全体の転送、このマシンのディレクトリの変更、または他のコンピューターへのコピーが必要になることがよくあります。開発にPycharm(または他のIDE)を使用する場合、最も一般的な問題は次のとおりimportです。

Pycharmの場合、最初にプロジェクトを他のコンピューターにコピーするか、他の人のプロジェクトをこのコンピューターにインポートします。プロジェクトを開いてインポートした後、左上のメニューで[設定]を開きます。

方法1:関連するライブラリを再インストールします(多くの依存関係がある場合は時間がかかります)。

方法2:コピーしたプロジェクトにvenvディレクトリがアタッチされていて、Lib \ site-packagesに依存ライブラリが含まれている場合は、現在のpythonインタープリターをvenvディレクトリのScripts \ python.exeに設定します。この図は、NewSysCrawlerとPyProjectsの2つの異なるプロジェクトのインタープリターを示しています。異なるプロジェクトでは、対応するサイトパッケージでパッケージを検索します。
【画像3】

このマシンでプロジェクトを移行する場合も同様です。作業環境が変更されている限り、関連するライブラリのインポートパスを自動的に更新できます。インポートによって記述された.pyの場合は、左側のプロジェクトフォルダーを右クリックし、[ディレクトリをソースルートとしてマーク]をクリックします。

4、まとめ

1. cmdコマンド:
cd /d X:\filedirディレクトリを入力し
cd ..\て、上位のディレクトリに戻ります。

2. pyinstallerパラメータ:
-Dディレクトリ構造(-F単一ファイルのパッケージ)にパッケージ化し
-i、.exeアイコンを設定して、
-wウィンドウなしで実行します。

3.注意事項:パス指定、依存ファイル(フォルダー)。

4.参照ソース:
Pyinstallerのパッケージ化と公開のエクスペリエンスの要約
pythonプロジェクトのパッケージ化(カスタムdll)anaconda3 + pyinstaller
ズームの実装、さまざまなサイズのアイコンの生成
PyQt5を使用してビジュアルクローラーソフトウェアを開発
PyInstallerパッケージングの実用的なガイド

5.追記:
インターフェースツールの開発からパッケージングまで、私は本当に多くの利益を得ました。しかし、執筆のレビューにはまだ多くの欠点があることがわかりました。いくつかの不規則な操作は、初心者の読者が「正しい方法をとる」のに役立ちません。それは、個人の機能的ニーズをほとんど満たしていないと言えます。厳格に、自分に燃料を追加してください!その後、著者はqrcファイルがリソース統合にも使用できるため、興味のある学生が自分でファイルを探索できることを発見しました。またね!

おすすめ

転載: blog.csdn.net/zohan134/article/details/106264783