9

画像やtxtなどのデータファイルをpythonプログラムに追加するときに、pyinstallerに問題があります。たとえば、アイコンを含むツールバーを作成し、images という名前の別のフォルダーに保存します。また、いくつかの構成を保存するためのいくつかのtxtおよびxmlファイルがあります。これらの txt ant xml ファイルは、data_files という名前の別のフォルダーに保存されます。すべての py ファイルは、source という名前の別のフォルダーに保存されます。

この python プログラムを pyinstaller でビルドしようとすると、pyinstaller はすべてのソース フォルダーを正常にビルドできますが、images および data_files フォルダーはビルドできません。pyinstaller のドキュメントを確認しましたが、解決策が見つかりませんでした。私は多くのグーグル検索を行いましたが、このリソースだけが役立つとわかりましが、これは非常に不十分なリソースです.

私の主な質問は次のとおりです。

編集: 解決策を見つけました。spec ファイルを作成するときは、.datasパラメータを指定する必要があります。

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), '/home/vmode/Desktop/derlem2/sources/TextSTAT.py'],
             pathex=['/home/pyinstaller'])
a.datas += [("Images/New.gif","/home/vmode/Desktop/derlem2/Images/New.gif","DATA")]
a.datas += [("Images/Open.gif","/home/vmode/Desktop/derlem2/Images/Open.gif","DATA")]
a.datas += [("Images/Column.gif","/home/vmode/Desktop/derlem2/Images/Column.gif","DATA")]
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'TextSTAT'),
          debug=False,
          strip=False,
          upx=True,
          console=1 )

上記の仕様コードは、私のプロジェクト用に設計されています。この仕様コードに見られるように、Python プログラムでビルドする 3 つのアイコンを含めました。プログラムが生成されると、これらのアイコンが埋め込まれたスタンドアロンの実行可能ファイルが作成されます。

しかし、非常に多くのファイルがある場合はどうなるでしょうか。プログラムで使用するアイコンが 1000 個あるとします。手動で spec ファイルに書き留めるだけでは不十分です。ファイル ディレクトリを読み取り、これらのファイルを動的に追加するには、ループ システムが必要です。しかし、これらのファイルを動的に追加する方法が見つかりませんでした。これらの非常に多くのファイルを手動で追加する機会はないと思います。知っている人はシェアしてください。

4

2 に答える 2

5

実行可能ファイルを作成する際にも、この問題に遭遇しました。.spec ファイルは python を使用しているため、glob モジュールが私のソリューションでした。

imagesList = []
imagesList.append( ('icon.ico', '..\\pathfinder\\icon.ico',  'DATA') )
import glob
allImages = glob.glob('..\\pathfinder\\*.png')
for eachImage in allImages:
    imageParts = eachImage.split('\\')
    imagesList.append( (imageParts[-1], eachImage,  'DATA') )
print imagesList
a.datas += imagesList

icon.ico に関する 2 行目は、ファイル拡張子が異なるため、別の行であり、除外することができます。「..\pathfinder」は、すべてのプログラム ファイルのパスです (pyinstaller ディレクトリからの相対パス)。glob はすべての .png ファイルのディレクトリを検索し (私は 65 個あり、それらすべてを手動で書き込むことを拒否しました)、それらのリストを文字列として返します。完全な相対ディレクトリはそのままです。ファイル名のリストに分割するために、バックスラッシュで string.split() を使用しました。次に、それぞれに対して、ユーザーが作成したリストに、分割された文字列の最後の部分 (最終的にはイメージのファイル名になります) とフル パス名のタプルを追加します。最後に、すべてのファイルのリストを使用して、それを a.datas に追加します。

これが実際に正しく機能することをコマンドラインで確認しました。追加のファイル拡張子のループを再コピーできます。

残念ながら、ファイル名を正しく取得して添付しているように見えますが、私の実行可能ファイルはまだファイルで作成されていないようです (または実行可能ファイルが独自のデータ内でファイルを見つけることができません)。それが機能するための同じディレクトリ。おそらく、タプルの要素の順序が間違っている可能性があります (したがって、そうであれば、それに応じてコードを調整する必要があります)。願わくば、この動的ロードが引き続き機能することを願っています。imageParts[-1] は各 .png のファイル名を表し、eachImage はそのフル パス (グロブで使用されている場合は相対パス) を表します。

于 2012-12-01T03:40:12.577 に答える
1

すべての画像が同じディレクトリにリストされている場合は、ツリーを使用できます

dict_tree = Tree('/home/vmode/Desktop/derlem2/Images', prefix = 'Images')
a.datas += dict_tree
于 2014-01-16T15:38:44.443 に答える