这个问题可能听起来很奇怪,因为我知道我会强制执行一个奇怪的情况>它偶然出现了(一个人可能会说的错误),我甚至知道要避免它,所以请跳过那一部分。
我真的很想了解我看到的行为。
该功能的目的是将目录中具有给定前缀的所有文件添加到存档中。我注意到,即使有一个" 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没有提及任何内容。我阅读了有关添加成员的方法的部分,并使用搜索itself
和same name
。
我认为它会被自动跳过,但我不知道如何进行实际检查。我个人希望添加一个零长度文件作为成员,但我理解跳过,因为我实际上更有意义。
问题忽略将档案添加到自身tarfile.add()
中的所需行为?它在哪里说?
答案 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