这是从 svn 获取 tar 文件并从中提取一个文件的一种方法:
import tarfile
from subprocess import check_output
# Capture the tar file from subversion
tmp='/home/me/tempfile.tar'
open(tmp, 'wb').write(check_output(["svn", "cat", "svn://url/some.tar"]))
# Extract the file we want, saving to current directory
tarfile.open(tmp).extract('dir1/fname.ext', path='dir2')
其中 'dir1/fname.ext' 是 tar 存档中所需文件的完整路径。它将保存在 'dir2/dir1/fname.ext' 中。如果省略路径参数,它将保存在当前目录下的 'dir1/fname.ext' 中。
上面可以这样理解。在普通的 shell 命令行上,svn cat url 告诉 subversion 将 url 定义的文件发送到标准输出(有关更多信息,请参阅svn help cat)。 url 可以是 svn 可以理解的任何类型的 url,例如 svn://...、svn+ssh://... 或 file://...。我们使用 subprocess 模块在 python 控制下运行此命令。为此,svn cat url 命令被分解为一个列表:["svn", "cat", "url"]。此svn 命令的输出保存到由tmp 变量定义的本地文件中。然后我们使用 tarfile 模块来提取你想要的文件。
或者,您可以使用 extractfile 方法将文件数据捕获到 python 变量:
handle = t.extractfile('dir1/fname.ext')
print handle.readlines() # show file contents
根据文档,tarfile 应该接受子进程的标准输出作为文件句柄。这将简化代码并消除在本地保存 tar 文件的需要。但是,由于一个错误,Issue 10436,这将不起作用。