我计划创建一个巨大的可执行目录并将其安装在某些设备上。
想象一下,后来我发现我的 python 模块中有一个错误。
有没有办法只传输/复制修改后的字节码,并用新的字节码替换原始字节码。
我想这样做的原因是,在我的上下文中,带宽非常昂贵,我想远程修补代码。
示例:我有一个包含两个文件的项目:prog.py
:(以下三行)
import mod1
if __name__ == "__main__":
mod1.hello()
mod1.py
:(以下两行)
def hello():
print("hello old world")
现在我用PYTHONHASHSEED=2 pyinstaller prog.py
创建我的目录并将其复制到我的设备
现在我修改mod1.py
:
def hello():
print("hello new world")
我重新编译PYTHONHASHSEED=2 pyinstaller prog.py
完整目录(去皮和压缩)大小约为 10M
文件dist/prog/prog
大小约为1M
with pyi-archive_viewer
我可以提取PYZ-00.pyz
从我的可执行文件中dist/prog/prog
In PYZ-00.pyz
我可以找到并提取mod1
仅使用 133 字节。
现在,如果我将该文件复制到我的设备,我如何更新旧的dist/prog/prog
这样,它就有了新的PYZ-00.pyz:mod1
字节码。
我可以使用什么代码来分解,在替换一个特定文件(模块)后我可以使用什么代码来重新组装?
替代方案:将 pyc 文件移动到 zip 文件启动性能并不是那么重要。我还可以使用替代解决方案,其中不创建 PYZ 文件并将其添加到可执行文件中,但 dist 目录包含一个包含所有 .pyc 文件的 zip 文件
另一种选择:将 .pyc 文件复制到应用程序目录中这会导致__file__
与 PYZ 模式中的值完全相同。性能方面可能不太好并创建大量文件,但如果增量更新至关重要,也许是处理它的一种选择。