web-dev-qa-db-ja.com

「バージョンファイル」はどのように見えますか?

私はこれを何年もの間ずっとググってきて、結果は出ていません。 PyInstaller マニュアルにはこう書かれています:

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

いいですね。実行可能ファイルにバージョン情報を入れたいのですが。問題は、「バージョンファイル」がどのように見えるのか手掛かりがなく、使用できるものの単一の例が見つからないことです。私は、バージョンファイルの例をこの質問への許容可能な回答と見なします。


私が試したこと

マニュアルはまた言います:

バージョン
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行目、
印刷vs 
ファイル "C:\ pyinstaller-2.0\PyInstaller\utils\versioninfo.py "、147行、__ repr __ 
%(indent、self.ffi .__ repr __(indent)、indent、
ファイル" C:\ pyinstaller- 2.0\PyInstaller\utils\versioninfo.py "、line 251 in __repr __ 
" filevers =%s、 "%fv、
 TypeError:すべての引数が文字列のフォーマット中に変換されるわけではありません

残りの上。

30
Hubro

ソースをざっと見ただけです。バージョンファイルは、提供されたバージョンファイルとして読み込まれ、eval 'edされるため、Pythonソース自体であると予想されます。

GrabVersion.pyスクリプトは既にお気づきのようにエラーを生成するように見えるので、FixedFileInfo__repr__関数を変更して、タプル引数を文字列に手動で変換しました。

Windows cmd.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でバージョンリソースを設定したことはないので、これが機能するかどうかはわかりません。フィードバックに興味があります。

28
Austin Phillips

以前の回答でこれが欠落しているか、これらの回答が最初に提供されたためにPyInstallerが更新された可能性がありますが、PyInstallerの現在のドキュメントは このためのかなり単純な方法 提供されるコマンドラインツールを使用して教えますPyInstaller(このセクションを最初に数回見逃しましたが、ドキュメントを調べました)。

このツールを「見栄えの良い」バージョン情報を持つシステム上の.exeファイルに向けると、人間が読めるコメント付きの編集可能なバージョンリソースファイルが作成され、これを開始点として使用できます。

pyi-grab_version executable_with_version_resource

デフォルトでは、ファイルfile_version_info.txtを作業ディレクトリに書き込みます。

Svn.exeのローカルコピーで上記を実行すると、以下が生成されます。

# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.Microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
  ffi=FixedFileInfo(
# filevers and prodvers should be always a Tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 9, 7, 30920),
prodvers=(1, 9, 7, 30920),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x4,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
  kids=[
StringFileInfo(
  [
  StringTable(
    u'040904B0',
    [StringStruct(u'CompanyName', u'Apache Software Foundation'),
    StringStruct(u'FileDescription', u'svn'),
    StringStruct(u'FileVersion', u'1.9.7'),
    StringStruct(u'InternalName', u'SVN'),
    StringStruct(u'LegalCopyright', u'Copyright (c) The Apache Software Foundation'),
    StringStruct(u'OriginalFilename', u'svn.exe'),
    StringStruct(u'ProductName', u'Subversion'),
    StringStruct(u'ProductVersion', u'1.9.7 (r1800392)')])
  ]), 
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)

これを目的に合わせて編集し、--version-fileとしてPyInstallerにフィードバックします。

pyinstaller [options] myscript.py --version-file file_version_info.txt
6
mac

以前の回答を使用してバージョンファイルを作成し、version.rcとして保存します

filename.specファイルを見つけて開きます。そのスクリプトの次の場所を見つけます。

exe = EXE(pyz,...)

セクション全体の最後に、このコードを追加して、exeファイルにバージョン情報を自動的に埋め込みます

version='version.rc'

それを保存してからpyinstallerをもう一度起動し、今度は次のコードを使用してインストーラーを実行します。

pyinstaller filename.spec 

これにより、exeファイル自体が作成されるだけでなく、すべてのバージョン情報も含まれます。

考えていない場合は、filenameをプログラムのファイル名に置き換えてください

4
vampnerdlord

Python 3のPyinstaller-version-fileオプションに問題があり、 Simple Version Resource Tool を使用して解決しました)= =。

このツールを使用すると、任意のバージョンリソースのコンテンツを表示できます。/voオプションを任意の実行可能ファイルで使用するだけです:verpatch.exe /vo c:\Windows\System32\cmd.exe

newversion resourceを実行可能ファイルに追加するには、次の例に従ってください。

verpatch.exe script.exe 1.0.0.0 /va /pv 1.0.0.0 /s description "Your product description" /s product "Your product name" /s copyright "Your company name, 2016" /s company "Your company name"

2
J. Mulet

バージョンファイルはPythonコードを使用しているため、.pyではなく.rc拡張子を付けることができます。

これにより、IDEで適切にフォーマットされていることを確認したり、エラーをチェックしたり(もちろん、「未解決の参照」を無視)、他のことを実行したりすることができますPythonを使用すると、.

1
tivnet