Python子进程模块将路径作为字符串发送

时间:2019-10-02 14:26:45

标签: python python-3.x ubuntu terminal zip

我正在使用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/*'之类的东西,那么它将再次引发名称不匹配的错误。

4 个答案:

答案 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)

其中archiveNamefolderToArchive是(我认为是不言自明的)字符串,我之前已经对其进行了修改。

文档:

  

https://docs.python.org/3.7/library/subprocess.html#replacing-older-functions-with-the-subprocess-module

或更具体地说:

  

https://docs.python.org/3.7/library/subprocess.html#replacing-os-system