Вот один из способов, чтобы получить деготь файл из SVN и извлечь один файл из всего этого:
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'. Если вы опустите аргумент path, он будет сохранен в 'dir1/fname.ext' в текущем каталоге.
Вышеуказанное можно понять следующим образом. В командной строке с нормальной оболочкой svn cat url
сообщает subversion отправить файл, определенный url в stdout (см. svn help cat
для получения дополнительной информации). url
может быть любым типом URL, который понимает svn, например svn://...
, svn+ssh://...
, или file://...
. Мы запускаем эту команду под управлением python с помощью модуля подпроцесса. Для этого команда svn cat url
распадается на список: ["svn", "cat", "url"]
. Результат этой команды svn
сохраняется в локальном файле, определяемом переменной tmp
. Затем мы используем модуль tarfile для извлечения нужного файла.
В качестве альтернативы, вы можете использовать метод extractfile для захвата данных из файла в переменную питона:
handle = t.extractfile('dir1/fname.ext')
print handle.readlines() # show file contents
Согласно документации, файл обработан должен принять стандартный вывод Подпроцесса в качестве дескриптора файла. Это упростит код и устранит необходимость сохранения файла tar локально. Однако из-за ошибки Issue 10436 это не сработает.
Вам не нужно Python извлекать отдельные файлы из архива. 'man tar', чтобы найти нужные вам параметры. Конечно, вам нужен tarball, прежде чем вы сможете манипулировать им ... – MattDMo
MattDMo Мне нужно сделать это программно, и мой архив находится в svn repo. –