比较两个由Python生成的Linux PyInstaller可执行文件

6
问题很简单,但是我没有看到任何示例。
我需要比较由PyInstaller生成的两个可执行文件,并确定哪个是更新的(但不是通过简单的时间戳)。 时间戳可能更新,但内容保持不变。只有在两个时间戳都更新且内容不同的情况下,我才需要替换旧文件。
有什么例子解决方案吗?例如在PyInstaller中使用简单版本标签(奇怪,但找不到太多信息,在手册中只说了使用Windows版本文件)。
更新:
- Linux可执行文件 - 可以访问文件生成过程。 - 它是cli应用程序,最好不要使用vcs,提供一些简单的解决方案。 - 实际比较过程将发生在Python脚本中。 - 尝试使用建议的filecmp - 即使是生成2次(带shallow=False标志)相同构建,它也返回False
从我的角度来看,最佳选择是比较内容和时间戳。如果时间戳更新且内容不同,则表示有新版本。

试过使用filecmp了吗?https://docs.python.org/2/library/filecmp.html - Any Moose
你能够获取文件生成的方式吗? - yorodm
使用BeyondCompare。 - Adrian Keister
顺便说一句,给这些问题投反对票是不公平的,因为所有这些问题最初都在主题本身或初始描述中得到了回答。 - user1935987
我认为“新”的定义从上下文中是非常清晰的。如果你通常需要写一页非常精确的定义和上下文信息来解释一些短语,那么这是一种非常低效的沟通方式。 - user1935987
显示剩余4条评论
1个回答

5
当你运行pyinstaller时,必须确保进行可复制的构建。也就是说,可以使用位比较对执行文件进行比较。根据文档所述:
Python使用随机散列(hash)来生成字典和其他散列类型,这会影响编译后的字节码以及PyInstaller内部数据结构。因此,即使应用程序包的所有组件相同,两个构建的结果可能不会产生完全相同的位,同时两个应用程序的执行方式也相同。
要实现这一点,只需在运行pyinstaller之前将PYTHONHASHSEED环境变量设置为一个常数即可。
PYTHONHASHSEED=1
export PYTHONHASHSEED
pyinstaller --onefile test.py

unset PYTHONHASHSEED

接下来,你可以使用任何你想要的工具/模块来比较可执行文件,例如filecmp,BeyondCompare等等,甚至在Linux中只需使用一个简单的校验和:

cksum dist/test
编辑:关于给二进制文件添加时间戳或标签,你可以在构建完成后使用以下方法向 Linux 二进制文件添加附加注释:
# Create a file with the notes or comments to add to the binary. 
# I am adding the current date for versioning info
date > version

# Add notes to the binary
objcopy --add-section .pyversion=version --set-section-flags .pyversion=noload,readonly dist/test dist/test-with-version

# Check the version/notes on the new binary
objdump -sj .pyversion dist/test-with-version

你应该得到类似这样的东西:
dist/test-with-version:     file format elf64-x86-64
Contents of section .pyversion:
0000 46726920 53657020 31342031 343a3339  Fri Sep 14 14:39
0010 3a333620 41455354 20323031 380a      :36 AEST 2018.

不错!你也可以在Python中添加一个时间戳字符串,并使用命令行参数将其返回。 - Stephen Rauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接