4

我使用 PyInstaller 将我的应用程序捆绑在 exe 中(截至目前适用于 Windows)。我已经通过创建 version.rc 文件成功地将版本信息添加到 exe 文件中。我还想在运行时使用当前版本来做出一些决定。因此,我想在使用 pyinstaller 创建包时动态创建 version.rc 文件。也只想参考当前版本。所以,我在根目录下创建了一个 _version.py 文件。该文件包含一个属性和一个函数

__version__ = '0.0.0.1'
def write_version_file():
    content = f'''
    VSVersionInfo(
        ffi=FixedFileInfo(
        mask=0x3f,
        flags=0x0,
        OS=0x40004,
        fileType=0x1,
        subtype=0x0,
        date=(0, 0)),
        kids=[StringFileInfo([StringTable(
        u'040904B0',
        [StringStruct(u'FileDescription', u'spagent'),
        StringStruct(u'FileVersion', u'{__verison__}'),
        StringStruct(u'InternalName', u'spagent'),
        StringStruct(u'LegalCopyright', u'Copyright'),
        StringStruct(u'OriginalFilename', u'spagent'),
        StringStruct(u'ProductName', u'spagent'),
        StringStruct(u'ProductVersion', u'{__verison__}'),
        StringStruct(u'Language', u'Language Neutral'),
        StringStruct(u'LegalTrademarks', u'')])]), 
        VarFileInfo([VarStruct(u'Translation', [1033, 1200])])]
    )
    '''
    filePath = os.path.join('version.rc')
    with open(filePath, 'w') as w:
        w.write(content)

我正在尝试在规范文件中执行 write_version_file 脚本,以便它在创建构建之前写入 version.rc 文件。并使用该文件进行版本控制。下面是我的 main.spec 文件的摘录。

# -*- mode: python -*-
block_cipher = None
import shutil
import glob
from distutils.dir_util import copy_tree

#create version file
from _version import write_version_file
write_version_file()

我的目录结构如下

spagent
--_version.py
--main.py
--main.sepec
--other directories

pyinstaller main.spec 无法执行脚本,因为它无法导入 _version 模块。

Traceback (most recent call last):
  File "C:\Users\chaudm05\AppData\Local\Programs\Python\Python37-32\Scripts\pyinstaller-script.py", line 11, in <module>
    load_entry_point('PyInstaller==3.5', 'console_scripts', 'pyinstaller')()
  File "c:\users\chaudm05\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\__main__.py", line 111, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "c:\users\chaudm05\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\__main__.py", line 63, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "c:\users\chaudm05\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\building\build_main.py", line 844, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "c:\users\chaudm05\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\building\build_main.py", line 791, in build
    exec(code, spec_namespace)
  File "main.spec", line 8, in <module>
    from _version import write_version_file
ModuleNotFoundError: No module named '_version'

我怀疑是这样,因为 pyinstaller 脚本在不同的位置执行(c:\users\chaudm05\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\building\build_main.py)因此它找不到_version.py。如果这是真的,我该如何实现呢?

4

0 回答 0