如何使用Python subprocess实现zip压缩后对输出执行AES加密
问题排查与修复方案
存在的问题
- zip命令参数缺失:原始shell命令中
zip -9 - test.txt的-代表将压缩结果输出到标准输出,你的代码中遗漏了这个参数,会导致zip直接生成本地压缩包而非输出到管道。 - Popen参数列表格式错误:使用列表形式传参时,每个命令参数都需要单独作为列表的一个元素,不能将多个参数拼接为单个字符串;同时你错误地将
stdin=compress.stdout写进了参数列表里,属于Python语法错误。 - openssl参数与传参错误:
-md参数后不需要加等号,且你遗漏了输出文件名test.ENC的参数配置,还重复声明了stdin参数。
修复后可运行代码
import subprocess # 第一步:执行zip压缩,结果输出到标准输出 compress_proc = subprocess.Popen( ['zip', '-9', '-', 'test.txt'], stdout=subprocess.PIPE ) # 第二步:读取zip进程的输出作为输入,执行AES加密 encrypt_proc = subprocess.Popen( ['openssl', 'enc', '-aes-256-cbc', '-md', 'sha256', '-out', 'test.ENC', '-pass', 'pass:123456'], stdin=compress_proc.stdout ) # 等待进程执行完成 encrypt_proc.wait()
简化写法
如果命令是固定无外部可变参数的场景,也可以直接开启shell=True直接执行完整的管道命令,写法更简洁:
import subprocess cmd = "zip -9 - test.txt | openssl enc -aes-256-cbc -md sha256 -out test.ENC -pass pass:123456" subprocess.run(cmd, shell=True, check=True)
内容的提问来源于stack exchange,提问作者Dev Dev
相关产品推荐
相关产品推荐

