6

pyinstaller: を使用して非常に基本的な python スクリプトを作成しよprint 'hello world!'としています。データ ファイルまたはデータ ファイルのディレクトリをバイナリで使用できるようにしようとしています。

ドキュメントを何度も読み、1.5、2.0、および 2.0 の dev ビルドでビルドしてみました。--onefile と --onedir でビルドしてみました。OS X でビルドしてみました。 Linux ですが、何らかの理由で、.spec ファイル内の datafile/tree ステートメントが無視されているようです。

私が試した .spec ファイルのバリエーションを次に示します。

coll = COLLECT(exe,
               a.binaries
               [('README','/Users/username/my_little_app/foo','DATA')],
               Tree('/Users/username/my_little_app/foo','foo'),
               Tree('/foo','foo'),
               Tree('my_little_app/foo','foo'),
               [('my_xml_file.xml','my_little_app/partner.xml','DATA')],
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name=os.path.join('dist', 'my_little_app'))


a.datas += [('my_xml_file.xml', '/Users/username/my_little_app/my_xml_file.xml',  'DATA')]

足りないものはありますか??

4

2 に答える 2

12

この回答はかなり遅れていますが、任意のファイルを PyInstaller ビルドに追加する方法はかなり明確に文書化されています。

https://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-files-to-the-bundle

タプルの最初の文字列はファイルへのパスで、2 番目の文字列はビルドされたパッケージの下にあるパスです。つまり、最後の行は次のようになります。

a.datas += [("/path/to/my_xml_file.xml", "my_xml_file.xml")]

次のように完全なディレクトリを追加することもできます。

a.datas += [("/path/to/dir", "dir")]

以下のドキュメントの関連部分を追加しました。


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

バンドルにファイルを追加するには、ファイルを説明するリストを作成し、それをAnalysis呼び出しに提供します。

データ ファイルの追加

datas=への引数の値として、ファイルを説明するリストを指定しAnalysisます。データ ファイルのリストは、タプルのリストです。各タプルには 2 つの値があり、どちらも文字列である必要があります。

  • 最初の文字列は、現在このシステムにあるファイルを指定します。
  • 2 つ目は、実行時にバンドルされたアプリ内のファイルの名前を指定します。

たとえば、単一の README ファイルを 1 フォルダー アプリに追加するには、spec ファイルを次のように変更します。

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

datas=引数を 1 項目のリストにしました。この項目は、最初の文字列が既存のファイルがsrc/README.txt. このファイルは、 name のバンドルにコピーされますREADME

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

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

文字列は、 または のいずれ/\をパス区切り文字として使用できます。「glob」の省略形を使用して入力ファイルを指定できます。入力が複数のファイルの場合、出力文字列はフォルダーの名前になる場合があります。たとえば.mp3、特定のフォルダーのすべてのファイルを含めるには、次のようにします。

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

一致/mygame/sfx/*.mp3するすべてのファイルがバンドルにコピーされ、 という名前のフォルダーに保存されますsfx

入力ファイルまたはフォルダーへのパスは、最初のタプルのように絶対パスにすることも、2 番目のタプルのように相対パスにすることもできます。相対の場合は、spec ファイルの場所に対する相対と見なされます。

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

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

のすべてのファイルは、バンドルで/mygame/data指定されたフォルダーに再帰的にコピーされます。data

于 2015-11-02T13:33:42.287 に答える
0

簡単な説明

最新の公式ドキュメント: Adding Data Filesによると、specファイルは次のようになります。

a = Analysis(xxx,
             pathex=xxx,
             binaries=[],
             datas=[
                ('README', '.'),
                ("/Users/username/my_little_app/my_xml_file.xml", "."),
                ('DATA', 'DATA'),

                ('/Users/username/my_little_app/foo', 'foo'),
                ("/path/to/dir", "dir"),
            ],

詳細な説明

別の投稿で私の答えを参照してください:データファイルを追加するPyinstaller

于 2020-01-13T05:31:54.287 に答える