WindowsでPython3 + Qt5アプリケーションを構築する際の問題

最近、Windowsで小さなプログラムを作成する必要がありました。 私はそれのために開発することができたことがありません。

プログラム自体は単純で、比較的迅速に作成されました。 Windowsでより多くの時間を組み立てます。 選択したツール(Python3 + Qt5)がネイティブではなく、普遍的であることは明らかですが、ビルドにそれほど時間がかかるとは思っていませんでした。

したがって、私は練習を共有したいと思います。おそらく誰かが額をこの壁にたたく必要があります。

猫の下で、PyQt5アプリケーションをインストーラーを必要としないsingle-file.exeに簡単にアセンブルする方法を説明します。



私のタスクで最も有名なソリューションは、.exeでPythonアプリケーションをビルドすることです:py2exe、cx_freeze、pyinstaller。 みんなについてたくさん書かれています。 しかし、非常に多くの場合、作成者はハックワークで罪を犯します-プログラムは簡単かつ迅速に組み立てられ、同じコンピューター上で起動されます。 言うまでもなく、これらは2つの大きな違いです-開発環境とユーザーで起動しますか? 集会やタンバリンとのダンスなしで私のために動作します。 さらに、Qtを設定するユーザーはどれですか?



各楽器のチュートリアルがあります。 しかし、それぞれに独自の問題がありました:1つは開始しませんでした(pyinstallerはまだ実験モードで3番目のpythonをサポートしています)、もう1つは開始できないものを収集し、3番目は長い間何も収集せず、すべてをscりました。

長い闘争の後、py2exeが選ばれました。



適切なソースからコンポーネントを正しくインストールすることの成功の秘((直接的なリンクは提供しません。それらはまだ時代遅れになるため、探しているものを書きます):





setup.pyを共有します:



from distutils.core import setup import os, sys import py2exe from glob import glob import PyQt5 NAME="Proga" qt_platform_plugins = [("platforms", glob(PyQt5.__path__[0] + r'\plugins\platforms\*.*'))] data_files.extend(qt_platform_plugins) msvc_dlls = [('.', glob(r'C:\Windows\System32\msvc?100.dll'))] data_files.extend(msvc_dlls) # print(data_files) sys.argv.append('py2exe') setup( data_files=data_files, windows=[ { "script": "pyftp1.py", "icon_resources": [(0, "resources/favicon.ico")] } ], # zipfile=None, options={ "py2exe": { "includes":["sip", "atexit",], #       atexit   , sip   -      # "packages": ['PyQt5'], "compressed": True, "dist_dir": "dist/" + NAME, # "bundle_files": 0, #   (          msvc*.dll # "zipfile": None, #   "optimize": 2, } } )
      
      







これは最小限のプログラムです。 これで、アプリケーション自体をビルドできます。

 python setup.py py2exe
      
      







出力で、distに完成したプログラムが入ったフォルダーを取得します。

これは良いことですが、ユーザーにとって必ずしも便利ではありません。 このフォルダーで、Inno Setupなどのインストーラーの作成者を設定し、msiを取得できます。 私の場合、最小限のユーザー権限でプログラムの操作性を確保する必要がありました-インストールする権利がまったくありません。



そこで私は先に進み、7-zipを使用して1つのファイルにまとめました。 スキームは次のとおりです。7zアーカイブを作成し、特殊なSFXヘッドと構成がそれにドッキングされます。 ヘッドは、アーカイブを一時フォルダーに解凍し、構成を調べて、目的のexeファイルを実行します。 次のようになります:

cat 7zS.sfxリソース/ config.txt Proga.7z> Proga.exe



構成ファイルでさまざまなオプションを指定できます。最小値を設定します。

 ;!@Install@!UTF-8! Title="Proga" RunProgram="Proga\\pyftp1.exe" ;!@InstallEnd@!
      
      







唯一の欠点は、exeファイルの見苦しい画像-標準のアンパッカーです。 そして、私たちは彼を必要な絵に置き換えます:

RESHACKER.exe -addoverwrite Proga.exe、Proga.exe、resources / favicon.ico、ICONGROUP、MAINICON、0



コンソールでこれに悩まされないように、小さなMakefileを作成しました。

 # start settings DIST=dist # change NAME also in setup.py and resource/config.txt NAME=Proga EXT=exe # final name and location of the built program FINAL=$(DIST)/$(NAME).$(EXT) # external programs 7ZIPDIR="C:\Program Files\7-Zip" RESHACKER="/c/Program\ Files/Resource\ Hacker/ResourceHacker.exe" # intermediate steps # no icon version of program NOICON=$(DIST)/$(NAME)_no_icon.$(EXT) # name of .7z archive 7Z_BASENAME=$(NAME).7z 7Z=$(DIST)/$(7Z_BASENAME) # folder with ready .exe PROGDIR=$(DIST)/$(NAME) all: $(FINAL) $(FINAL): $(NOICON) # change icon "$(RESHACKER)" -addoverwrite $(NOICON), $(FINAL), resources/favicon.ico, ICONGROUP, MAINICON, 0 $(NOICON): $(7Z) #build autorunning sfx with default icon cat $(7ZIPDIR)/7zS.sfx resources/config.txt $(7Z) > $(NOICON) $(7Z): exe # compress program folder to .7z cd $(DIST); $(7ZIPDIR)\\\7z.exe a $(7Z_BASENAME) $(NAME) exe: $(DIST) # build program itself python setup.py py2exe $(DIST): # create dist directory # echo $(DIST)/ clean: rm -rf $(DIST)/*
      
      







これで、プログラムを非常に簡単に再構築できます。

 mingw492-make.exe clean all
      
      







アセンブリで頑張ってください!

あなたの経験を教えてください!



All Articles