Pythonで作成したexeにファイルバージョン情報を追加する方法

2020-05-04

はじめに

プログラミング言語Python(PyInstallerやPy2exe等)で作成したexeファイル(実行ファイル)に対してバージョン情報を追加したい、という話です。

環境・前提は以下になります。

  • Windows 10 Home
  • Python 3.7~3.8
  • Anaconda 使用していません
Python

Windowsのexeファイルを右クリックした場合、通常は以下のようなファイル情報が表示されます。

しかし、Python(PyInstallerやPy2exe)でexe化したファイルについては、以下のようにバージョンなどの情報が設定されていません。

私がここの「ファイルの説明」「ファイルバージョン」等の情報について追加(追記・設定)した方法について記載します。

これらの情報、正式名称は何ていうのでしょうね。ファイルリソース?バージョンリソース?

以下「バージョン情報」と記載します。

Visual Studio等のIDEを使えば簡単なことなのですが、そんなことが意外と難しく。

ResourceHackerで設定

結論を先に話すと、「ResourceHacker.exe」というツールを使いました。

インターネットで調べた感じだと、PyInstallerでもPy2exeでもexe作成時にバージョン情報を設定できるような感じなのですが、とりあえず私はできませんでした。

それについても最後に記載します。

ここを読んでくださっている皆さまもおそらく目的は「バージョン情報を追加すること」であり、手段は問わないはずです。PyInstallerやPy2exeに固執しないことをお勧めします。

私は以下のサイトを参考に作業しました。

既存の.exe、.dllのバージョン情報を設定する方法

作業概要

「GoRC」と「ResourceHacker」という2つのツールを使用します。

それほど面倒ではないと思います。概要は以下になります。

  1. GoRCでバージョン情報をファイル化
  2. 1で作成したバージョン情報を目的のexeファイルに付加

です。ちなみにResourceHacker上で編集も可能です。

GoRCでバージョン情報を抽出

※バージョン情報のベースとするexeがある場合は、このGoRCでの作業は不要です。

Resource Compiler – A free resource compiler (GoRC.exe)というツール使用します。

The Go tools for Windows + Assembler

Download GoRC version 1.0.2.1 (with documentation 63K)

というリンクからダウンロードしました。

まず、以下のような内容の「Resources.rc」的な名前のファイルをエディタで作成します。

VS_VERSION_INFO VERSIONINFO
    FILEVERSION    1,0,0,0
    PRODUCTVERSION 1,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "会社名を入力\0"
            VALUE "FileDescription",    "説明を入力\0"
            VALUE "FileVersion",        "1.0.0.0\0"
            VALUE "LegalCopyright",     "コピーライトを入力\0"
            VALUE "OriginalFilename",   "ファイル名を入力\0"
            VALUE "ProductName",        "製品名を入力\0"
            VALUE "ProductVersion",     "1.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x409, 1200
    }
}

作成した「Resources.rc」を「GoRC.exe」のアイコンにドラッグ&ドロップすると「Resources.rc」と同じフォルダに「Resources.res」というファイルができます。

これでGoRC.exeの役目は終わりです。

Resource Hackerでバージョン情報を追加

以下のサイトからResource Hackerというツールをダウンロードします。

Resource Hacker

私はページ一番下の「Download version 5.1.7:」の「ZIP install (3.0MB)」をダウンロードしました。(個人的には「install」と書かれるとなんだか怖いです。)

解凍して「ResourceHacker.exe」を実行します。↓

この画面上に、バージョン情報を設定したいexeファイルをドラッグ&ドロップします。↓

↑ここではファイル情報を記載すべき「Version Info」がありません。

そこで、先ほどGoRCで作成した「Resources.res」を読み込ませます。

メニューの[Action]から[Add from Resource file(*.res, *.mui, *.dll, *.exe)…]を選択し、

先ほどGoRCで作成した「Resources.res」かバージョン情報のベースとするexeを選択します。

次に表示される「Import Resources…」画面で「Version Info」にチェックをつけて「Import」をクリックします。↓

そうすると左ビューに「Version Info」が追加され、選択すると右ビューにバージョン情報が表示されます。

右ビューで編集可能です。

ちなみにこのツール、ちょっとクセがあり、右ビューで修正しても、左ビューで違う項目を選び直したりしないと修正が反映できません。(Saveができない)

修正を反映したい場合は以下の画面を表示して「Compile」を選択してください。

それで変更内容が保存されます。

メニューの[Save As]ボタンをクリックして、exeファイルを保存します。

(バージョン情報の保存とexeの出力が別なのかな?)

できあがったexeファイルを右クリックして確認し、終了です。

ファイルバージョンが書き換わらない場合は、右ビューの一番上の方の「FILEVERSION」という記載部分を確認してみてください。

ちなみにですが、この作業を行ってもexeファイルの更新日時は更新されません。

バージョン情報の追加については以上です。

以下、PyInstallerとPy2exeでバージョン情報を追加「できなかった」経緯についてです。

PyInstallerでバージョン情報を追加できず

PyInstallerでのバージョン情報追加については、(ちょっと古いですが)以下のブログを参考にやってみました。

上記のブログを読んだ感じだと、バージョンリソースファイルというものの設計?がとても複雑そうで、「1から作成するのは無理だから、他のファイルから持ってきたバージョンリソースファイルを編集し、それを自作したexeに埋め込みましょう」という話です。

だとするとPyInstallerでバージョン情報を(編集・訂正ではなく)作成・追加することが困難なのも納得ですし、他の方法でもきっと難しいのでしょう。

で、実際にやってみると、というかその前段階として

PyInstallerインストール済みの自分のマシンにそもそも「py-grab_version.py」というスクリプトが存在しませんでした。

上記のブログが2014年のものでしたので、おそらく当時のPyInstallerのパッケージには「py-grab_version.py」が入っていたのでしょう。

2020年05月現在、PyInstaller 3.6には「py-grab_version.py」は入っていません。

よって、PyInstallerでバージョン情報の追加はできませんでした。

ちなみに私が試したバージョンは以下になります。

  • Python 3.7~3.8
  • PyInstaller 3.6

Py2exeでバージョン情報を追加できず

インターネットの情報を見ていると、Py2exeで使用するsetup.pyのsetup()の中に「name=’hoge’」「version=’hoge’」「description=’hoge’」的な記載をすればバージョン情報を設定できるように読めるのですが、私はできませんでした。

内容、項目などいろいろ試してみたのですが…

参考にしたサイトは以下です。

基本的に古い情報ですが、皆さんできているんでしょうかね。

「以前はできたけど今はできない」ということなのでしょうか、私の作業がおかしいのでしょうか。

ちなみに私が試したバージョンは以下になります。

  • Python 3.7~3.8
  • Py2exe 0.9.2.2~0.9.3.2

Py2exeの0.9.3.2は、以下のブログを参考にpipからではなくダウンロードしてインストールしました。

py2exeをpython 3.5 – 3.7で使う

まとめ

私の場合、以下のような経緯でした。

  1. Py2exeでバージョン情報を追加できず
  2. PyInstallerでバージョン情報を追加できず
  3. ResourceHackerでバージョン情報を追加

1日程度ですが、長い道のりでした。

PyInstallerやPy2exeで「できる」という情報があるにも関わらず、私にはできませんでした。ミスなのか力量なのか環境なのか。

以上。

後記

最後までお読みくださりありがとうございます。

こんなに更新したのに、現在はほぼ誰も見ていないゴミカスクズ無価値ブログです。

よければ(はてな)ブックマークや拡散をお願いいたします。

更新の原動力として励ましが欲しいのです…<(_ _)>

当ブログ内お薦め記事

記事はここまでです。