web-dev-qa-db-ja.com

Pyinstallerと--onefile:exeファイルにイメージを含める方法

Pyinstallerを使用してexeファイルを作成しました。

pyinstaller.exe --onefile --icon='Loco.ico program.py

プログラムでは、プロットに画像を含め、プログラムをフォルダーで単独で実行すると、次のようになります。

IOError: [Errno 2] No such file or directory: 'Logo.png'

1つの解決策は、以下のリンクにあるように、exeのフォルダーにイメージを含めることです。

pyinstallerは画像とアイコンを表示しません

しかし、再び--onefileの要点は、正確にそれを保持することであり、画像を追加する必要はありません。解決策はこのリンクにあると思いますが、私はそれを理解していません。

PyInstallerによるデータファイルのバンドル(--onefile)

私のスペックファイルは次のようになります。

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
    pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
    hiddenimports=[],
    hookspath=None,
    runtime_hooks=None)

pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True , icon='AMOS.ico')
13
Nautilius

編集:

私は自分の問題の解決策を見つけたと信じています。

# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
         pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None)

for d in a.datas:
    if 'pyconfig' in d[0]:
        a.datas.remove(d)
        break

a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='AMOS_Visualizer.exe',
      debug=False,
      strip=None,
      upx=True,
      console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')

そして、私のmain.pyスクリプトに以下を追加します

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Logo = resource_path("Logo.png")
14
Nautilius

Qt Designerを使用している場合は、リソースファイルを作成し、Logo.pngを含む必要なすべての画像をこのリソースに追加することでそれを行うことができます。

リソースファイルを作成するには、 GUIにQT Designerを使用して画像を挿入する の手順に従います。

リソースファイルに画像を挿入したら、Logo.pngをウィンドウアイコンに割り当て、QtDesignerインターフェイスを保存し、次のコマンドを使用してリソースファイルを変換します。pyrcc4 -py3 resourcetest.qrc -o resourcetest_rc.py

最後に、-onefileオプションを使用してexeファイルを作成します。スペックファイルを編集する必要はありません。

3
Diego

「hiddenimports = []」の前に「datas = ['ファイルの場所']」を追加します。やります。私の場合、これはうまくいきました

    # -*- mode: python -*-

block_cipher = None


a = Analysis(['embed.py'],
             pathex=['C:\\Users\\Aravind\\Desktop\\exe'],
             binaries=[],
             datas=['C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png'],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='embed',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )
3
Aravind S

これは次のバリエーションです: PyInstaller(--onefile)でデータファイルをバンドルする 、そして与えられた答えはより明確です。

2行で:

  1. 画像ファイルを「データ」に追加する必要があります(スペックファイルまたはPyInstallerフックスクリプトを使用)
  2. 存在する場合はsys._MEIPASSを使用します。
    単一行base_path = getattr(sys, '_MEIPASS', '.')+'/'を使用して、「root_path」変数を取得し、すべてのファイルのパスに連結します。
    次に、filepath = base_path + filepath
2
2diabolos.com

私はたくさん試しましたが、これは1時間後にうまくいきました:

プログラムファイルMilaBild.pyを初めて実行すると、次のようになります。

pyinstaller -F -w MilaBild.py

上記の他のコメントで述べたように、以下を追加する必要がある「.spec」ファイルを作成するように継ぎ合わせます。

a.datas += [('rosa.png','C:\\Python34\\rosa.png', 'DATA')]

私の画像ファイルの名前はrosa.pngです。それは私のプログラムファイルMilaBild.pyと同じディレクトリにあります。

次に、上記のコメントで述べたように、実際のプログラムファイルに上記の部分も追加する必要がありました。

def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
    # PyInstaller creates a temp folder and stores path in _MEIPASS
    base_path = sys._MEIPASS
except Exception:
    base_path = os.path.abspath(".")

return os.path.join(base_path, relative_path)

次に、ファイルを変数に取得する部分を追加し、それが機能しました。

rosa = resource_path("rosa.png")

私は多くのことを試みました、そして、この仕事を作るためだけに私は1時間かかりました。後で、サウンドとサブディレクトリの2つのイメージでそれを作成しようとします。しかし、今のところは23時45分であり、それは別の日になります。私はこのすっかり遠く、私にとって大きな休憩時間にとても満足しています。

1
Michael Larsson

最後に、私がさまざまなWebページやここで見つけたものよりも簡単です。

1)コードをコンパイルされた実行可能ファイルとして実行するときに、一時ディレクトリの相対パスをコードで指定します。

if getattr(sys, 'frozen', False): # Running as compiled
    running_dir = sys._MEIPASS + "/files/" # Same path name than pyinstaller option
else:
    running_dir = "./" # Path name when run with Python interpreter
iconFileName = running_dir + "mylogo.ico"
if os.path.isfile(iconFileName):
    root.iconbitmap(iconFileName) # Exemple for tkinter usage

2)コンパイラー・オプションでファイルが保管される一時ディレクトリーのパスを指定します。

pyinstaller --onefile --add-binary "mylogo.ico;files" -i mylogo.ico myMainPrg.py

このようにして、ファイルが開発中の場所や、本番環境にインストールする場所の完全なパスを知る必要はありません。

0
Le Droid