5

私はよくcx_freezeを使用して、Pythonソースをすべての依存関係とともにパッケージ化し、その後、 distutilsbdist_msi 拡張機能を使用してmsiインストールパッケージを作成します。

唯一の問題は、以前のバージョンをアンインストールせずに、新しく作成したmsiWindowsインストーラーを再インストールしようとしたときに発生します。アンインストーラーは、以前にアンインストールされたすべてのバージョンのソフトウェアの記録を保持し、レジストリとアンインストーラーの情報をブロットします。

以前にインストールしたバージョンのソフトウェアを検出して、新しいバージョンをインストールせずに自動的にアンインストールすることはできますか?

私はNSISを知っており、インストーラーを作成するためのPythonバインディングを使用すると、上記の問題を簡単に解決できます。残念ながら、現時点では、Pythonが提供するもの(distutils)以外のものは探していません。

4

2 に答える 2

9

cx_Freezeには、ドキュメントで次のように説明されbdist_msiているオプションがありますupgrade-code

作成されるパッケージのアップグレードコードを定義します。これは、これをインストールする前に、同じアップグレードコードで作成されたパッケージを強制的に削除するために使用されます

setup()それを指定するには、次のような呼び出しに渡す必要があると思います。

options = {"bdist_msi": {"upgrade-code":"..."}}

-(このように使用するのがオプション名であるか、オプション名であるかを常に忘れている_ので、それが間違っている場合は、次のように試してくださいupgrade_code

Microsoftによると、アップグレードコードはGUID(ランダムに生成されたコード)である必要があります。

于 2012-12-20T18:35:00.017 に答える
5

トーマスKの答えは近いですが、少なくとも私の場合、正確ではありません。いくつかの試行錯誤の結果、GUIDを中括弧で囲む必要があることがわかりました。

bdist_msi_options = {
    "upgrade_code": "{96a85bac-52af-4019-9e94-3afcc9e1ad0c}"
    }

これらのオプションは、「build_exe」オプションと一緒に渡す必要があります(一部のオンライン例では、これらの引数に他の名前を使用していますが、bdist_msiのみが機能することがわかりました)。

setup(  # name, version, description, etc...
        options={"build_exe": build_exe_options, # defined elsewhere
                 "bdist_msi": bdist_msi_options},
        executables=[Executable("run.py",
                                base="win32GUI",
                                shortcutName="My Program name",
                                shortcutDir='ProgramMenuFolder')])

このコードを使用すると、私の場合、以前のインストーラーが正しくアンインストールされ、プログラムの追加/削除リストから削除されました。

于 2013-10-21T16:52:23.890 に答える