2016-12-04 6 views
1

それでは、私は簡単なのPyQtアプリmain.py得たとしましょう:パッケージ化されたPythonアプリケーションをpyinstallerで整理するには?

import sys 
from PyQt5 import QtWidgets 


def main(): 

    app = QtWidgets.QApplication(sys.argv) 

    w = QtWidgets.QWidget() 
    w.resize(250, 150) 
    w.move(300, 300) 
    w.setWindowTitle('Simple') 
    w.show() 

    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

をし、私は1つのフォルダにアプリをパッケージ化しmain.specを得た:

# -*- mode: python -*- 

block_cipher = None 

import inspect, os 
current_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 

a = Analysis(['main.py'], 
      pathex=[current_path], 
      binaries=[], 
      datas=[], 
      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, 
      exclude_binaries=True, 
      name='main', 
      debug=False, 
      strip=False, 
      upx=False, 
      console=True) 
coll = COLLECT(exe, 
       a.binaries, 
       a.zipfiles, 
       a.datas, 
       strip=False, 
       upx=False, 
       name='main') 

pyinstaller main.specをやっての結果はとなります

enter image description here

:ファイルの混乱を持って取り組んでPyQtはアプリそれで、ここには、私は現在の結果が気に入らず、--onefile(tempディレクトリにファイルを展開する考えは私の紅茶ではありません)を使うオプションが嫌いです。

今、私はこの問題の解決策を提示しているこの面白いarticleを見つけました。この単純なmcveでここを再現しようとしていましたが、何らかの理由で私はある時点で立ち往生しています。ここで私が続いてきた段階です:上記main.specファイル

3)Iにruntime_hooks=['.\\pyinstaller\\use_lib.py']で私がruntime_hooks=[]置き換えられてきた

import sys 
import os 
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "lib")) 

2):私はファイルpyinstaller\use_lib.pyを作成しました

1)

上記のスクリーンショットのような乱雑なファイル群を生成した pyinstaller main.spec 4)すべての依存ファイルをlibディレクトリに手動で移動しました。結果はです。

enter image description here

問題:実行しようとするとアプリがクラッシュします:

enter image description here

は、なぜあなたはそれがクラッシュだと思いますか?どのステップで私は台無しにしましたか?それを修正する方法を教えていただけますか?

答えて

0

これらのdllをexeから別のディレクトリに移動することはできません。これらのdllは静的にリンクされており、exeと同じディレクトリに配置する必要があります。

とにかく。 C:\Program Files内のアプリケーションフォルダを調べます。これらのディレクトリのそれぞれには、たくさんのファイルがあります。それはちょうどそれが行く方法です。ユーザーはこれらのフォルダを調べないため、誰も気にしません。

アプリケーションを配布する場合は、ほかのすべての開発者の役割を果たす必要があります。 PyInstallerを使用した後のフォルダの状態は、アプリケーションの最終形式ではなく、最初の形式のみです。すべてのC/C++アプリケーションは、この正確な形式からユーザーに向かいます。

したがって、アプリケーションをユーザーに配布する場合は、インストーラーツールの1つを使用する必要があります。 Windowsプラットフォーム用のインストールパケットのベストフォームは、msiパケット(Windowsインストーラ用)です。 msiパケットを作成するには、WiX Installermsiパケットを作成する最も簡単な方法)またはMS Visual Studioを使用します。また、インストールパケットのexe形式を生成する多くのインストールツールがあります(通常、msi-toolsよりもはるかに簡単です)。NSIS,Inno SetupInstallShield(有料!)なども検索できます。このインストーラにはhttps://pypi.python.org/pypiデータベースがあります。このインストールツールのいくつかを管理するために使用できる特殊なPythonパケットがいくつかあります。

関連する問題