将文件添加到自身时,tar file.add()的预期行为是什么?

时间:2013-07-24 14:57:05

标签: python python-3.x tarfile

这个问题可能听起来很奇怪,因为我知道我会强制执行一个奇怪的情况>它偶然出现了(一个人可能会说的错误),我甚至知道要避免它,所以请跳过那一部分。

我真的很想了解我看到的行为。

该功能的目的是将目录中具有给定前缀的所有文件添加到存档中。我注意到,即使有一个" bug",该程序也能正常工作(原文如此!)。我想了解原因。

代码非常简单,所以我允许自己发布整个函数:

def pack(prefix, custom_meta_files = []):
  postfix = 'tgz'  
  if prefix[-1] != '.':
    postfix = '.tgz'

  archive = tarfile.open(prefix+postfix, "w:gz")
  files = filter(lambda path: path.startswith(prefix), os.listdir())
  #print('files: {0}'.format(list(files)))

  for file in files:
    print('packing `{0}`'.format(file))
    archive_name = file[len(prefix):]   #skip prefix + dot
    archive.add(file, archive_name)

  not_doubled_metas = set(custom_meta_files) - set(archive.getnames())
  print('metas to add: {0}'.format(not_doubled_metas))
  for meta in not_doubled_metas:
    print('packing `{0}`'.format(meta))
    archive.add(meta)
  print('contents:{0}'.format(archive.getnames()))

正如人们可以注意到我使用prefix创建存档,然后通过列出cwd中的所有内容并通过lambda过滤它来创建要打包的文件列表。归档当然会通过过滤器。如果名称不重叠,还有一个片段可以添加固定文件,尽管我认为这并不重要。

因此,此类运行的输出是:

packing `ga_run.seq_niche.N30.1.bt0_5K.params`
packing `ga_run.seq_niche.N30.1.bt0_5K.stats`
packing `ga_run.seq_niche.N30.1.bt0_5K.tgz`
metas to add: {'stats.meta'}
packing `stats.meta`
contents:['params', 'stats', 'stats.meta']

因此脚本尝试添加自身,但它不会出现在最终内容中。我不知道预期的行为是什么,但根本没有警告,documentation没有提及任何内容。我阅读了有关添加成员的方法的部分,并使用搜索itselfsame name

我认为它会被自动跳过,但我不知道如何进行实际检查。我个人希望添加一个零长度文件作为成员,但我理解跳过,因为我实际上更有意义。

问题忽略将档案添加到自身tarfile.add()中的所需行为?它在哪里说?

1 个答案:

答案 0 :(得分:1)

tarfile.py代码从3.2扫描到2.4,它们的代码类似于:

# Skip if somebody tries to archive the archive...
if self.name is not None and os.path.abspath(name) == self.name:
    self._dbg(2, "tarfile: Skipped %r" % name)
    return