Python脚本不会从归档中删除文件 - 通过终端打印的命令工作正常

时间:2016-08-15 16:11:22

标签: python python-2.7 command archive

我使用以下代码在Python中创建存档:

#Creates archive using string like [proxy_16-08-15_08.57.07.tar]
proxyArchiveLabel = 'proxy_%s' % EXECUTION_START_TIME + '.tar'
log.info('Packaging %s ...' % proxyArchiveLabel)

#Removes .tar from label during creation
shutil.make_archive(proxyArchiveLabel.rsplit('.',1)[0], 'tar', verbose=True)

因此,这会在本地目录中创建一个存档。问题是,由于文件的大小和缺乏此任务的必要性,我希望删除我的档案中的特定目录。

ExecWithLogging('tar -vf %s --delete ./roles/jobs/*' % proxyArchiveLabel)
# ------------
def ExecWithLogging(cmd):
    print cmd
    p = subprocess.Popen(cmd.split(' '), env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while(True):
      log.info(p.stdout.readline().strip())
      if(p.poll() is not None):
        break

然而,这似乎基本上什么也没做。大小保持不变。如果我在cmd内打印ExecWithLogging,并将该命令复制/过去到脚本工作目录中的终端,则可以正常工作。为了确定,我还尝试将编译存档的完整路径硬编码为tar -vf %s --delete命令的一部分,但似乎仍然没有发生。

我确实在我的INFO日志中得到了这个输出:tar: Pattern matching characters used in file names,所以我有点想Popen正在以某种方式错误地解释我的命令......(或者更确切地说,我'更有可能传递错误的东西)。

我做错了吗?我还能尝试什么?

1 个答案:

答案 0 :(得分:2)

您可能必须在tar命令中使用--wildcards选项,这将启用模式匹配。这可能就是你在日志中看到的,有点隐秘。

编辑: 在回答你的问题为什么?我怀疑shell正在执行通配符扩展,而通过Popen提供的命令则没有。 tar的--wildcard选项强制tar执行通配符扩展 有关更详细的说明,请参见此处:
Tar and wildcards