44

私は何年もの間これをグーグルで検索してきましたが、結果はありません。PyInstallerのマニュアルには次のように書かれています。

--version-file=ファイル
    バージョン リソースを FILE から exe に追加します。

いいですね。実行可能ファイルにバージョン情報を入れたい。問題は、「バージョン ファイル」がどのように見えるか見当がつかないことと、使用できるものの例が 1 つも見つからないことです。この質問に対する受け入れ可能な回答として、バージョン ファイルの例を考えてみます。


私が試したこと

マニュアルには次のようにも書かれています。

バージョン
Windows NT ファミリのみ。version='myversion.txt'. GrabVersion.py を使用して実行可能ファイルからバージョン リソースを取得し、出力を編集して独自のバージョン リソースを作成します。(バージョン リソースの構文は非常に難解なので、ゼロから作成しようとはしません。)

私は今、私のシステムから数え切れないほどの実行可能ファイルでこれを試みました。これらのエラーが発生し続けます:

トレースバック (最新の呼び出しが最後):
  ファイル「C:\pyinstaller-2.0\utils\GrabVersion.py」の 42 行目
    vs = versioninfo.decode(sys.argv[1])
  ファイル「C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py」、33 行目、デコード
    nm = win32api.EnumResourceNames(h, RT_VERSION)[0]
IndexError: リスト インデックスが範囲外です

バージョン情報を持たない実行可能ファイル、および:

トレースバック (最新の呼び出しが最後):
  ファイル「C:\pyinstaller-2.0\utils\GrabVersion.py」の 43 行目
    印刷対
  ファイル「C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py」、147 行目、__repr__ 内
    % (インデント, self.ffi.__repr__(インデント), インデント,
  ファイル「C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py」、251 行目、__repr__ 内
    "filevers=%s," % fv,
TypeError: 文字列のフォーマット中にすべての引数が変換されるわけではありません

残りについて。

4

6 に答える 6

41

ソースをざっと見ただけです。バージョン ファイルは、提供されたバージョン ファイルが読み取られてからeval編集されるため、Python ソース自体であると予想されるようです。

GrabVersion.pyあなたがすでに見つけたように、スクリプトはエラーを生成するように見えるので、タプル引数を手動で文字列に変換するように の関数を変更しました__repr__FixedFileInfo

Windowscmd.exeには Windows バージョンのリソースが埋め込まれてGrabVersion.pyいます。ファイルに保存して PyInstaller にフィードする出力は次のとおりです。

VSVersionInfo(
  ffi=FixedFileInfo(
    filevers=(6, 1, 7601, 17514),
    prodvers=(6, 1, 7601, 17514),
    mask=0x3f,
    flags=0x0,
    OS=0x40004,
    fileType=0x1,
    subtype=0x0,
    date=(0, 0)
    ),
  kids=[
    StringFileInfo(
      [
      StringTable(
        u'040904B0',
        [StringStruct(u'CompanyName', u'Microsoft Corporation'),
        StringStruct(u'FileDescription', u'Windows Command Processor'),
        StringStruct(u'FileVersion', u'6.1.7601.17514 (win7sp1_rtm.101119-1850)'),
        StringStruct(u'InternalName', u'cmd'),
        StringStruct(u'LegalCopyright', u'\xa9 Microsoft Corporation. All rights reserved.'),
        StringStruct(u'OriginalFilename', u'Cmd.Exe'),
        StringStruct(u'ProductName', u'Microsoft\xae Windows\xae Operating System'),
        StringStruct(u'ProductVersion', u'6.1.7601.17514')])
      ]), 
    VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)

PyInstaller でバージョン リソースを設定しようとしたことがないので、うまくいくかどうかわかりません。フィードバックをお待ちしています。

于 2013-01-31T12:47:28.407 に答える