我正在使用Python 3脚本压缩文件夹。
我通常在终端机中使用的命令,它有效,是
zip -P P4ssw0rd somefolder.zip somefolder/*
(-PI用于密码加密,最后是/*
,因为我要压缩文件夹的内容,如果我不压缩它,则存档只包含一个空文件夹)
这将成功创建一个 somefolder.zip ,其中包含正确的受密码保护的内容。
当我从脚本执行此命令时,我正在使用
subprocess.call(['zip', '-P', 'P4ssw0rd', 'somefolder.zip', 'somefolder/*'])
这给了我一个zip错误(与我直接在Terminal中编写命令,但是如果我拼写错误的文件夹名称(例如zip -P P4ssw0rd somefolder.zip someOtherfolder/*
时得到的错误)
警告说:
zip警告:名称不匹配:somefolder / *
根据我的理解,它会以某种方式将/和*解释为文件夹名称的一部分,而不是我尝试在文件夹内导航...
有什么想法吗?
使事情变得更加混乱:
如果somefolder.zip已经存在,则
subprocess.call(['zip', '-P', 'P4ssw0rd', 'somefolder.zip', 'somefolder/*'])
将执行。它说它正在更新文件夹的内容,但是据我从档案本身所知,实际上没有任何变化。但是,如果我将'somefolder/*'
更改为'someOtherfolder/*'
之类的东西,那么它将再次引发名称不匹配的错误。
答案 0 :(得分:1)
如果您不介意使用子流程模块以外的其他功能,则可以这样做:
os.popen("zip -P P4ssw0rd somefolder.zip somefolder/*")
当然,不要忘记事先import os
。
答案 1 :(得分:0)
这可能是因为您的脚本是从其他位置执行的。尝试传递绝对路径而不是相对路径。 例如
subprocess.call(['zip', '-P', 'P4ssw0rd', '-j', 'somefolder.zip', '/full/path/to/somefolder/*'])
答案 2 :(得分:0)
可能您应该手动将全局*
转换为文件列表
dir = 'somefolder'
files = [ dir + f for f in listdir(dir) ]
cmd = ['zip', '-P', 'P4ssw0rd', 'somefolder.zip' ] + files
subprocess.call(cmd)
答案 3 :(得分:0)
经过进一步检查,我发现@ImranD提出的os.system()
尽管有效,但建议将其替换为更新的supbrocess
模块。因此,实际上,最正确的方法是使用subprocess.call()
,但是应以其他方式提供参数。
例如,在我最初的问题中,正确使用subprocess.call()
的正确方法如下:
subprocess.call('zip -P P4ssw0rd somefolder.zip somefolder/*', shell=True)
实际上,我的行更像:
subprocess.call('zip -P P4ssw0rd ' + archiveName + ' ' + folderToArchive, shell=True)
其中archiveName
和folderToArchive
是(我认为是不言自明的)字符串,我之前已经对其进行了修改。
文档:
或更具体地说:
https://docs.python.org/3.7/library/subprocess.html#replacing-os-system