Skip to main content

python-exiv2 is a low level interface (or binding) to the exiv2 C++ library. It is built using SWIG to automatically generate the interface code. The intention is to give direct access to all of the top-level classes in libexiv2, but with additional “Pythonic” helpers where necessary.

Introduction

There are several other ways to access libexiv2 from within Python. The first one I used was pyexiv2 (old). After its development ceased I moved on to using gexiv2 and PyGObject. This works well, providing a Metadata object with high level functions such as set_tag_string and set_tag_multiple to get and set metadata values.

A more recent development is pyexiv2 (new). This new project is potentially very useful, providing a simple interface with functions to read and modify metadata using Python dict parameters.

For more complicated metadata operations I think a lower level interface is required, which is where this project comes in.

This project is at an early stage of development. It is already usable, but please email jim@jim-easterbrook.me.uk if it doesn’t work for you. Here is an example of what it can do:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> data['Exif.Image.Artist']._print()
'Jim Easterbrook'
>>>

Documentation

The libexiv2 library is well documented for C++ users, in Doxygen format. Recent versions of SWIG can convert this documentation to pydoc format in the Python interface:

$ pydoc3 exiv2.Image.exifData

Help on method_descriptor in exiv2.Image:

exiv2.Image.exifData = exifData(...)
    Returns an ExifData instance containing currently buffered
        Exif data.

    The contained Exif data may have been read from the image by
    a previous call to readMetadata() or added directly. The Exif
    data in the returned instance will be written to the image when
    writeMetadata() is called.

    :rtype: :py:class:`ExifData`
    :return: modifiable ExifData instance containing Exif values

Assignment

libexiv2 stores metadata values in a generalised container whose type can be set by the type of a value assigned to it, for example:

exifData["Exif.Image.SamplesPerPixel"] = uint16_t(162);

This forces the Exif.Image.SamplesPerPixel value to be an unsigned short. Python doesn’t have such specific integer types, so if you want to set the type you need to create an exiv2 value of the appropriate type and assign that:

exifData["Exif.Image.SamplesPerPixel"] = exiv2.UShortValue(162)

This allows you to set the value to any type, just like in C++, but the Python interface warns you if you set a type that isn’t the default for that tag. Otherwise you can set the value to any Python object and let libexiv2 convert the string representation of that object to the appropriate type:

exifData["Exif.Image.SamplesPerPixel"] = 162

Iterators

Several libexiv2 classes use C++ iterators to expose private data, for example the ExifData class has a private member of std::list<Exifdatum> type. The classes have public begin and end methods that return std::list iterators. In C++ you can dereference one of these iterators to access the Exifdatum object, but Python doesn’t have a dereference operator.

This Python interface converts the std::list iterator to a Python object that has a curr method to return the list value. It is quite easy to use:

Python 3.6.12 (default, Dec 02 2020, 09:44:23) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import exiv2
>>> image = exiv2.ImageFactory.open('IMG_0211.JPG')
>>> image.readMetadata()
>>> data = image.exifData()
>>> b = data.begin()
>>> b.curr().key()
'Exif.Image.ProcessingSoftware'
>>>

The Python iterators also have a next method that increments the iterator as well as returning the list value. This can be used to iterate over the data in a very C++ like style:

>>> data = image.exifData()
>>> b = data.begin()
>>> e = data.end()
>>> while b != e:
...     b.next().key()
...
'Exif.Image.ProcessingSoftware'
'Exif.Image.ImageDescription'
[skip 227 lines]
'Exif.Thumbnail.JPEGInterchangeFormat'
'Exif.Thumbnail.JPEGInterchangeFormatLength'
>>>

You can also iterate in a more Pythonic style:

>>> data = image.exifData()
>>> for item in data:
...     item.key()
...
'Exif.Image.ProcessingSoftware'
'Exif.Image.ImageDescription'
[skip 227 lines]
'Exif.Thumbnail.JPEGInterchangeFormat'
'Exif.Thumbnail.JPEGInterchangeFormatLength'
>>>

I think this is much better.

Warning: segmentation faults

It is easy to crash python-exiv2 if you delete objects which contain data that another object is pointing to. For example, deleting an Image after extracting its metadata can cause a segfault when the metadata is accessed. Ideally the Python interface to libexiv2 would use Python objects’ reference counts to ensure this doesn’t happen, preventing the deletion of the Image object until all references to it have been deleted. Unfortunately I haven’t found a sensible way to do this in the Python interface, so some care is needed when using it.

Error handling

libexiv2 has a multilevel warning system a bit like Python’s standard logger. The Python interface redirects all Exiv2 messages to Python logging with an appropriate log level.

Installation

Windows

Python “wheels” are available for Windows Python versions from 3.5 to 3.9. These include the libexiv2 library and should not need any other software to be installed. They can be installed with pip, for example:

C:\Users\Jim>"c:\Program Files\Python38\python.exe" -m pip install python-exiv2

Linux

Python “wheels” are available for Linux Python versions from 3.6 to 3.10. These include the libexiv2 library and should not need any other software to be installed. They can be installed with pip, for example:

sudo pip3 install python-exiv2

You can install for a single user with the --user option:

pip3 install --user python-exiv2

If the available wheels are not compatible with your operating system then pip will download the python-exiv2 source and attempt to compile it. This requires the “development headers” of Python3 and an appropriate compiler & linker to be installed.

If the development headers of libexiv2 are installed then pip will try to build python-exiv2 to use the installed version. Otherwise it will use the copy included in the download, which may not be compatible with your operating system.

Building python-exiv2

If you want customise your installation of python-exiv2 you can build it yourself. Download and unpack a source archive from PyPI or GitHub, then switch to the python-exiv2 directory. The setup.py script used to install python-exiv2 will use the libexiv2 installed by your operating system if it can find it. This usually requires the “development headers” package to be installed. In this case you just need to build python-exiv2 and install it as follows:

pip wheel -v .
sudo pip3 install python_exiv2-0.2.3-cp36-cp36m-linux_x86_64.whl

(The name of the wheel file will depend on the python-exiv2 version, your Python version, and the system architecture.)

If you want to use your own downloaded copy of libexiv2 then a few more steps are required. First you need to copy some files using the copy_libexiv2.py script. This has two parameters: the exiv2 directory and the exiv2 version. For example:

python3 utils/copy_libexiv2.py ../exiv2-0.27.4-Linux64 0.27.4

This copies the exiv2 header files and runtime library to the directory libexiv2_0.27.4/linux/. Now you can run pip as before. Note that pip will still use the system installed version of libexiv2 if it can find it. Uninstalling the “development headers” package will prevent this.

When you try to import exiv2 into Python it’s possible you might get an error like OSError: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /usr/lib64/python3.6/site-packages/exiv2/libexiv2.so.0.27.4). This happens if the downloaded copy of libexiv2 was built for a newer version of the GNU C library than is installed on your computer. In this case the only option is to build libexiv2 from source.

Download the exiv2 source archive, then follow the build instructions in README.md, but make sure you install to a local directory rather than /usr/local:

$ mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../local_install
$ cmake --build .
$ make install

Then, back in your python-exiv2 directory, copy sources from the newly created local directory:

python3 utils/copy_libexiv2.py ../exiv2-0.27.4-Source/local_install 0.27.4

Then run pip as before.

Problems?

I think it’s a bit early in the project to be using the “issues” page. Please email jim@jim-easterbrook.me.uk if you find any problems (or solutions!).

Download files

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

Source Distribution

python-exiv2-0.2.3.zip (5.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

python_exiv2-0.2.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64

python_exiv2-0.2.3-cp39-cp39-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.9Windows x86-64

python_exiv2-0.2.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

python_exiv2-0.2.3-cp38-cp38-win_amd64.whl (1.8 MB view details)

Uploaded CPython 3.8Windows x86-64

python_exiv2-0.2.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

python_exiv2-0.2.3-cp37-cp37m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.7mWindows x86-64

python_exiv2-0.2.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.0 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.2.3-cp36-cp36m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.6mWindows x86-64

python_exiv2-0.2.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

python_exiv2-0.2.3-cp35-cp35m-win_amd64.whl (1.7 MB view details)

Uploaded CPython 3.5mWindows x86-64

File details

Details for the file python-exiv2-0.2.3.zip.

File metadata

  • Download URL: python-exiv2-0.2.3.zip
  • Upload date:
  • Size: 5.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python-exiv2-0.2.3.zip
Algorithm Hash digest
SHA256 32a4e429c6c89f5c0350eac1f58b7e5638d3046c5921564ea575fac286bae2f3
MD5 c8689d1a19a0f5bfa2c7156a5d454878
BLAKE2b-256 5672ec9b92db16758ace307949606b826cf365a2e1bbee2d5237f6d74d02296d

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.2.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 59df8864e115c61df7ec6c60367b93ee3a7acb8186affeecccc581dbc8ea75ea
MD5 22e75c00d833d44f413bc5a842276c1a
BLAKE2b-256 02f10479561cf2b8ef7a6820fae2e6cbfe0b8f1e9738a0071b0bc2670032ebb2

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.2.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.2.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 820f1f3561f6ab377dd49e9d89266c4fa296e87a6d4b51195bbbdd71c543f55e
MD5 1e5f84715f8a9df59a0f8e8104060c80
BLAKE2b-256 60fdc4366296510d6e0de00c5664669505cc4edb756f86f5cf14613bd16e9960

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.2.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2725b16f7d45927e1211e879d6acd23fba3a8e5eade4528745b1e5bfb86a0c25
MD5 beab59141f171ae290da80def396d544
BLAKE2b-256 89d02699090b763a6457fec79c88a59c95410c3414f64dda084bb36e1546cdd3

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.2.3-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.2.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 7b849b37f41686f471634b18ed161e993d0b3964871908a9bcbb339bcb6d6d7f
MD5 050deb093d27d76737e105645429af46
BLAKE2b-256 5770a78fb502fcac24fc3a98b10cbd12935f435fbf62690cce2c257bc39ee3b7

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.2.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3dcb7744dd957d4aa073265f72d4771568118034c4221b114f8d0ec32536f0c0
MD5 c06f9814378f07013359d0251cd95ba4
BLAKE2b-256 a3ae00ddcd4b8240b75d29b366c500e7c617dcc3031ff52ee437a3902903e9aa

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.2.3-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.2.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 90191502adef7264fd7566cf48cac060919cd9294183b4822c94b8ca48207225
MD5 689c5e2b28895a0709ca9c6c6613853a
BLAKE2b-256 4115a45761a9b84727ed5e9cca628593a27862350a62ad3b1504c818c4cd3488

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.2.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7b138ba191efc2c22628cd49892e1a0fd6b3570c0c1b41397015eb88921f8f73
MD5 bb65cc31b910ebb393bd98428e3c507e
BLAKE2b-256 18f95b536913337bbf3a51f587f196a0ec8da5fee5c36b887ef190c04fad83c0

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.2.3-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.2.3-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 f54c50b08979fb060ee2f6835aef4f7840bb8c166818add4cfa58898b26b511f
MD5 56efa191d98c6de8340f087b33671ffd
BLAKE2b-256 91ab68e091eab064d3a56632ec8d0142e54113edb508d266f9c764f2ce7dd82b

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for python_exiv2-0.2.3-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a6299582cf2a496ae7a98d58755b8efaa82b6c95eeb9b4a4baf02d63017c3b16
MD5 1a5502557ee329ef26102a544ef70e0b
BLAKE2b-256 b4b6a96d12bc828b658d3457247dc18ab5f2c8945521af48fe87af7830fdfe4c

See more details on using hashes here.

File details

Details for the file python_exiv2-0.2.3-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: python_exiv2-0.2.3-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.6.12

File hashes

Hashes for python_exiv2-0.2.3-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 6031d83719ba54124243e5236b1015009080f63618ecb6f77594a03614b38689
MD5 50c2a1b8c1575cfedae7cc3e337c5b8a
BLAKE2b-256 7e4bfd257526575bfc1baa01d783a72c267b9320dabcfd895ce737b978316ac2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page