python 利用脚本命令压缩加密文件并删除源文件

python 自身有一个比较好的包 tarfile 以及 zipfile 都可以压缩文件,但是当我们需要加密压缩文件的时候,这两个包无法提供,根据官方资料 zipfile 的 setpassword 是无法设置密码的

ZipFile.setpassword(pwd):
Set pwd as default password to extract encrypted files

可以看到只能用在提取加密的文件的时候(解压)才能有效,详情见这里
另辟蹊径 
利用脚本调用命令并压缩添加文件的方式(支持 linux 与 window),主要方式是压缩命令方式解压用 zipFile 并设置密码解压

import subprocess
import zipfile as zf
import platform as pf
import os

class ZipObj():

    def __init__(self,filepathname,passwd):
        self.filepathname = filepathname
        self.passwd = passwd
    def enCrypt(self,deleteSource=False):
        """
            压缩加密,并删除原数据
            window系统调用rar程序

            linux等其他系统调用内置命令 zip -P123 tar source
            默认不删除原文件
        """
        target = self.filepathname+".zip"
        source = self.filepathname+".txt"
        if pf.system()=="Windows":
            cmd = ['rar','a','-p%s'%(self.passwd),target,source]
            p = subprocess.Popen(cmd,executable=r'C:\Program Files\WinRAR\WinRAR.exe')
            p.wait()
        else:
            cmd = ['zip','-P %s'%(self.passwd),target,source]
            p = subprocess.Popen(cmd)
            p.wait()
            #os.system(" ".join(cmd))
        if deleteSource:
            os.remove(source)
    def deCrypt(self):
        """
        使用之前先创造ZipObj类
        解压文件
        """
        zfile = zf.ZipFile(self.filepathname+".zip")
        zfile.extractall(r"zipdata",pwd=self.passwd.encode('utf-8'))


if __name__ == "__main__":
    zipo = ZipObj("文件名","文件密码")
#    zipo.enCrypt(deleteSource=False) ##
    zipo.deCrypt()

在我们设计器上可以改编为全局函数来执行

全局函数组件的使用参考这个: 关于 全局函数 组件的使用及 函数返回值 接收问题

函数内容如下

#导入包
import subprocess
import platform as pf
import os

#加密压缩函数
def enCrypt(filepathname,passwd,deleteSource=False):
    """
        压缩加密,并删除原数据
        window系统调用rar程序
        linux等其他系统调用内置命令 zip -P123 tar source
        
		filepathname:文件名(绝对路径)
		passwd:加密密码
		deleteSource:是否删除原数据,默认不删除原文件
		
    """
    target = filepathname+".zip"
    source = filepathname+".txt"
    if pf.system()=="Windows":
        cmd = ['rar','a','-p%s'%(passwd),target,source]
        p = subprocess.Popen(cmd,executable=r'C:\Program Files\WinRAR\WinRAR.exe')
        p.wait()
    else:
        cmd = ['zip','-P %s'%(passwd),target,source]
        p = subprocess.Popen(cmd)
        p.wait()
		#os.system(" ".join(cmd))
    if deleteSource:
            os.remove(source)