Python 3.73 cannot install py3exiv2

Vincent Vande Vyvre vincent.vande.vyvre at
Thu May 2 05:50:59 EDT 2019

Le 1/05/19 à 15:12, Ken Martell a écrit :
> I’m a retired aerospace engineer. I’m a Windows 10 user & have zero experience with Python. My goal is to learn, get this working & run lens distortion correction routines using Python. I’ve tried or many hours and read as much as I can but cannot get the py3exiv2 module to install. Other needed modules installed fine. It appears the Python version 2 of evix2 is needed as a dependent for the version 3 but neither pip or pip3 will install old or new. Sorry for taking your time but I’m a newbie just trying to help my fellow photographers correct  lens distortion problems in post-processing as well as my own.
> Any help much appreciated!
> Thank you
> Ken Martell
> Sent from Mail for Windows 10

The package available on PyPI is for *nix machines.

I don't have access to a Windows machine nor the knowledge to build an 
executable for Windows.

But, recently an user send me how it has successfully compiled py3exiv2 
for Windows.

Hello Vincent,

  I’ve run through the trouble of building py3exiv2 on Windows and was 
successful in doing so,

therefore I’d like to present you the steps I’ve taken to get there, so 
that you can alter and give some instructions on how to install 
it on Windows.

This is a copy of his mail:
  The key part in making this work is, it has both exiv2 and boost-python.

Here’s what I did:

- install GIT-2.21.0-64-bit.exe
- install VSCodeUserSetup-x64-1.33.1.exe
- clone vcpkg, note the folder name
     $ git clone
- install vcpkg by running .\bootstrap-vcpkg.bat
- run vcpkg.exe install boost-python:x64-windows
- run vcpkg.exe install exiv2:x64-windows
- make sure to add /installed/x64-windows/bin to the PATH (for dll import)
- get the pyexiv2 sources from here:
- replace with my version
- set the environment variable VCPKG to the folder where you installed it
- run pip install -e <py3exiv2-folder>

I’ve attached my modified version of It’s very rough since I 
don’t know much about setuptools at all, but it essentially involves 
bypassing `get_libboost_name` which fails completely on windows and 
using the environment variable VCPGK that has to be set by the user to 
point at the vcpkg directory. There’s probably a cleaner way of doing 
this, like accepting a command line argument. But again, I have no idea 
how setuptools handles this so hopefully you can clean it up a bit. 
`boost_python37-vc140-mt` is also completely hardcoded, you’d probably 
have to modify `get_libboost_name` to work on Windows.

  While I’m at this, I’ve noticed the lack of support for custom xmp 
tags. For now I’ve resorted to abusing various IPTC Tags for my purpose, 
but that’s a rather terrible solution. I’d appreciate it if you could 
prioritize adding that feature in the future.

  with best regards,


# -*- coding: utf-8 -*-

import sys
import os
import glob
import subprocess

from setuptools import setup, find_packages, Extension

from codecs import open
from os import path

here = path.abspath(path.dirname(__file__))

# Get the long description from the relevant file
with open(path.join(here, 'DESCRIPTION.rst'), encoding='utf-8') as f:
     long_description =

def get_libboost_name():
     """Returns the name of the lib libboost_python 3

     # libboost libs are provided without .pc files, so we can't use 
     places = ('/usr/lib/', '/usr/local/lib/', '/usr/')
     for place in places:
         cmd = ['find', place, '-name', 'libboost_python*']
         rep = subprocess.Popen(cmd, 
         if not rep:

         # rep is type bytes
         libs = rep.decode(sys.getfilesystemencoding()).split('\n')
         for l in libs:
             _, l = os.path.split(l)
             if '.so' in l:
                 l = l.split('.so')[0]
                 # Assume there's no longer python2.3 in the wild
                 if '3' in l[-2:]:
                     return l.replace('libboost', 'boost')

if == 'nt':
     basep = os.environ["VCPKG"] + r"\installed\x64-windows"
     os.environ["INCLUDE"] = basep + r"\include"
     libboost = basep + r"\lib\boost_python37-vc140-mt"
     libexiv = basep + r"\lib\exiv2"
     extra_compile_args = []
     libboost = get_libboost_name()
     extra_compile_args = []
     libexiv = 'exiv2'

     description='A Python3 binding to the library exiv2',
     author='Vincent Vande Vyvre',
     author_email='vincent.vandevyvre at',

     # See
         'Development Status :: 5 - Production/Stable',
         'Intended Audience :: Developers',
         'Topic :: Software Development',
         'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
         'Programming Language :: C++',
         'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8'
     keywords='exiv2 pyexiv2 EXIF IPTC XMP image metadata',
     packages = find_packages('src'),
     package_dir = {'': 'src'},
     package_data={'':['src/*.cpp', 'src/*.hpp',]},
     #cmdclass={'install': install}
         ['src/exiv2wrapper.cpp', 'src/exiv2wrapper_python.cpp'],
         libraries=[libboost, libexiv],


More information about the Python-list mailing list