pyinstallerの使用



Pyinstaller Use



公式文書:

https://pyinstaller.readthedocs.io/en/stable/spec-files.html



(一時的に最初に配置され、公式文書を2倍にする準備をする時間があります)

通常、最初のパッケージをコマンドで直接1回実行してから、生成されたスペックファイルをさらに編集します。



一般的なパラメータ:
-アイコン=アイコンパス
-ファイルexeファイルにパッケージ化されたF
-wコンソールなしでウィンドウを使用
-cコンソールを使用して、ウィンドウなし
-Dファイルexeおよびその他の依存関係を含むディレクトリを作成します
パラメータを表示するpyinstaller-h

一緒にファイルにパッケージ化され、より多くを使用します。

バンドルへのファイルの追加

バンドルにファイルを追加するには、ファイルを説明するリストを作成し、それをAnalysisに提供します。コール。単一のフォルダにバンドルする場合(を参照) 1つのフォルダにバンドル )、追加されたデータファイルは実行可能ファイルのあるフォルダにコピーされます。単一の実行可能ファイルにバンドルする場合(を参照) 1つのファイルにバンドル )、追加されたファイルのコピーは実行可能ファイルに圧縮され、_MEI*xxxxxx*に展開されます実行前の一時フォルダ。これは、1つのファイルの実行可能ファイルが追加されたファイルに加えた変更は、アプリケーションの終了時に失われることを意味します。



いずれの場合も、実行時にデータファイルを見つけるには、を参照してください。 実行時情報

データファイルの追加

--add-dataを使用して、データファイルをバンドルに追加できます。コマンドオプション、またはそれらをリストとしてスペックファイルに追加することによって。

スペックファイルを使用する場合は、ファイルをdatas=の値として説明するリストを提供してください。 Analysisへの引数。データファイルのリストはタプルのリストです。各タプルには2つの値があり、どちらも文字列である必要があります。

  • 最初の文字列は、現在このシステムにある1つまたは複数のファイルを指定します。
  • 2番目はの名前を指定します フォルダ 実行時にファイルを含めるため。

たとえば、1つのREADMEファイルを1フォルダーアプリのトップレベルに追加するには、次のようにスペックファイルを変更できます。

a = Analysis(... datas=[ ('src/README.txt', '.') ], ... )

そして同等のコマンドライン(を参照) 何をバンドルし、どこで検索するか プラットフォーム固有の詳細について):

pyinstaller --add-data 'src/README.txt:.' myscript.py

datas=を作成しました引数は1項目のリストです。アイテムは、最初の文字列が既存のファイルがsrc/README.txtであることを示すタプルです。そのファイルは(スペックファイルの場所に対して)検索され、バンドルされたアプリのトップレベルにコピーされます。

文字列は/のいずれかを使用できますまたはパス区切り文字として。 「glob」の略語を使用して入力ファイルを指定できます。たとえば、すべての.mp3を含める特定のフォルダからのファイル:

a = Analysis(... datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ], ... )

すべての.mp3フォルダ内のファイル/mygame/sfx sfxという名前のフォルダーにコピーされますバンドルされたアプリで。

追加されたファイルのリストを別のステートメントで作成すると、スペックファイルが読みやすくなります。

added_files = [ ( 'src/README.txt', '.' ) ( '/mygame/sfx/*.mp3', 'sfx' ), ] a = Analysis(... datas = added_files, ... )

フォルダの内容全体を含めることもできます。

added_files = [ ( 'src/README.txt', '.' ) ( '/mygame/data', 'data' ), ( '/mygame/sfx/*.mp3', 'sfx' ), ]

フォルダ/mygame/data dataという名前で複製されますバンドルで。

モジュールからのデータファイルの使用

追加するデータファイルがPythonモジュール内に含まれている場合は、pkgutil.get_data()を使用してそれらを取得できます。

たとえば、アプリケーションの一部がhelpmodという名前のモジュールであるとします。スクリプトとそのスペックファイルと同じフォルダーに、次のフォルダー配置があります。

helpmod __init__.py helpmod.py help_data.txt

スクリプトにはステートメントimport helpmodが含まれているため、PyInstallerはバンドルされたアプリにこのフォルダー配置を作成します。ただし、含まれるのは.pyのみです。ファイル。データファイルhelp_data.txt自動的に含まれることはありません。それも含まれるようにするには、datasを追加します。スペックファイルへのタプル:

a = Analysis(... datas= [ ('helpmod/help_data.txt', 'helpmod' ) ], ... )

スクリプトを実行すると、help_data.txtが見つかります。前のセクションで説明したように、ベースフォルダパスを使用します。ただし、このデータファイルはモジュールの一部であるため、標準ライブラリ関数pkgutil.get_data()を使用してその内容を取得することもできます。

import pkgutil help_bin = pkgutil.get_data( 'helpmod', 'help_data.txt' )

Python 3では、これはhelp_data.txtの内容を返します。バイナリ文字列としてのファイル。実際に文字である場合は、デコードする必要があります。

help_utf = help_bin.decode('UTF-8', 'ignore')

バイナリファイルの追加

注意

バイナリファイルとは、DLL、ダイナミックライブラリ、共有オブジェクトファイルなどを指し、PyInstallerはこれらをさらにバイナリ依存関係を検索します。画像やPDFなどのファイルはdatasに入れる必要があります。

--add-binaryを使用して、バイナリファイルをバンドルに追加できます。コマンドオプション、またはそれらをリストとしてスペックファイルに追加することによって。スペックファイルで、必要なファイルを説明するタプルのリストを作成します。タプルのリストをbinaries=に割り当てます分析の議論。

通常、PyInstallerは.soについて学習しますおよび.dllインポートされたモジュールを分析することによるライブラリ。モジュールがインポートされているかどうかが明確でない場合があります。その場合は、--hidden-import=を使用します。コマンドオプション。しかし、それでもすべての依存関係が見つかるとは限りません。

モジュールがあるとしますspecial_ops.soこれはCで記述されており、PythonC-APIを使用しています。プログラムはspecial_opsをインポートし、PyInstallerはspecial_ops.soを見つけてインクルードします。しかし、おそらくspecial_ops.so libiodbc.2.dylibへのリンク。 PyInstallerはこの依存関係を見つけません。この方法でバンドルに追加できます。

a = Analysis(... binaries=[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ], ...

またはコマンドラインを介して(ここでも、を参照してください) 何をバンドルし、どこで検索するか プラットフォーム固有の詳細について):

pyinstaller --add-binary '/usr/lib/libiodbc.2.dylib:.' myscript.py

データファイルと同様に、追加するバイナリファイルが複数ある場合は、別のステートメントでリストを作成し、名前でリストを渡します。

pyinstallを使用した後に発生する可能性があります実行可能exeファイルの問題としてパッケージ化されたpyファイル:

Traceback (most recent call last): File 'goziClassifylear_test1.py', line 20, in <module> File 'd:pythonpython3.6libsite-packagesPyInstallerloaderpyimod03_importers.py', line 714, in load_module module = loader.load_module(fullname) ModuleNotFoundError: No module named 'PyQt5.sip' [226528] Failed to execute script lear_test1

解決:

まず最初にインストールされたモジュールPyQt5.sip

pip install PyQt5.sip If insufficient permissions problem, perform: pip install --user PyQt5.sip

必要なpyファイルにパッケージ化されたPyQt5.sipをインポートし、パッケージ化プロセスを再実行します

Py in the file, add the line import PyQt5.sip