Skip to main content

Python adapter for universal, libarchive-based archive access.

Project description

To eliminate some problems with installation, the public API has been moved from the `libarchive` package to `libarchive.public`, and will be reflected in the next release. This is backwards-incompatible, but would otherwise prevent the install due to broken dependencies during install.

Introduction

A ctypes-based adapter to libarchive. The source-code is written to be clear and intuitive.

Even 7-Zip is supported for both reading and writing.

I could definitely use some help, if any is available. Completeness will require a bit more work (see libarchive’s archive.h and archive_entry.h).

Installation

PyPI:

$ sudo pip install libarchive

Notes

The Ubuntu libarchive package maintainer refuses to place a “libarchive.so” symlink, so you’ll have to place this yourself. Depending on your Ubuntu, this can be libarchive.so.12, libarchive.so.13, or libarchive.so.14 .

For example:

/usr/lib/x86_64-linux-gnu$ sudo ln -s libarchive.so.12 libarchive.so

Task List

Done Task
X Read entries from physical file
X Read entries from archive hosted in memory buffer
X Write physical files from archive
X Load memory buffer from archive
X Populate physical archive from physical files
X Populate archive hosted in memory buffer
Populate archive entries from memory buffers
Fill-out the entry object’s information/accessors

Examples

To extract to the current directory from a physical file (and print each relative filepath):

import libarchive.public

for entry in libarchive.public.file_pour('/tmp/test.zip'):
    print(e)

To extract to the current directory from memory:

import libarchive.public

with open('/tmp/test.zip', 'rb') as f:
    for entry in libarchive.public.memory_pour(f.read()):
        print(e)

To read files from a physical archive:

import libarchive.public

with libarchive.public.file_reader('test.7z') as e:
    for entry in e:
        with open('/tmp/' + str(entry), 'wb') as f:
            for block in entry.get_blocks():
                f.write(block)

To read files from memory:

import libarchive.public

with open('test.7z', 'rb') as f:
    buffer_ = f.read()
    with libarchive.public.memory_reader(buffer_) as e:
        for entry in e:
            with open('/tmp/' + str(entry), 'wb') as f:
                for block in entry.get_blocks():
                    f.write(block)

To specify a format and/or filter for reads (rather than detecting it):

import libarchive.public
import libarchive.constants

with open('test.7z', 'rb') as f:
    buffer_ = f.read()
    with libarchive.public.memory_reader(
            buffer_,
            format_code=libarchive.constants.ARCHIVE_FORMAT_TAR_USTAR,
            filter_code=libarchive.constants.ARCHIVE_FILTER_GZIP
        ) as e:
        for entry in e:
            with open('/tmp/' + str(entry), 'wb') as f:
                for block in entry.get_blocks():
                    f.write(block)

To read the “filetype” flag for each entry:

import libarchive.public

with open('test.7z', 'rb') as f:
    buffer_ = f.read()
    with libarchive.public.memory_reader(f.read()) as e:
        for entry in e:
            print(e.filetype)

The output of this is:

EntryFileType(IFREG=True, IFLNK=True, IFSOCK=True, IFCHR=False, IFBLK=False, IFDIR=False, IFIFO=False)
EntryFileType(IFREG=True, IFLNK=True, IFSOCK=True, IFCHR=False, IFBLK=False, IFDIR=False, IFIFO=False)
EntryFileType(IFREG=True, IFLNK=True, IFSOCK=True, IFCHR=False, IFBLK=False, IFDIR=False, IFIFO=False)

To create a physical archive from physical files:

import libarchive.public
import libarchive.constants

for entry in libarchive.public.create_file(
                'create.7z',
                libarchive.constants.ARCHIVE_FORMAT_7ZIP,
                ['/etc/profile']):
    print(entry)

To create an archive in memory from physical files:

import libarchive.public
import libarchive.constants

with open('/tmp/new.7z', 'wb') as f:
    def writer(buffer_, length):
        f.write(buffer_)
        return length

    for entry in libarchive.public.create_generic(
                    writer,
                    format_name=libarchive.constants.ARCHIVE_FORMAT_7ZIP,
                    files=['/etc/profile']):
        print(entry)

Testing

libarchive uses [nose](https://nose.readthedocs.org) for testing:

tests$ ./run.py

Project details


Release history Release notifications

History Node

0.4.5

History Node

0.4.4

This version
History Node

0.4.3

History Node

0.4.2

History Node

0.4.1

History Node

0.3.10

History Node

0.3.9

History Node

0.3.8

History Node

0.3.7

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
libarchive-0.4.3-py2-none-any.whl (22.6 kB) Copy SHA256 hash SHA256 Wheel 2.7 Jul 23, 2014
libarchive-0.4.3.tar.gz (10.9 kB) Copy SHA256 hash SHA256 Source None Jul 23, 2014

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page