pythonimportdependenciespython-sippyd

Python: how to deal with several .pyd dependencies with the same name?


I have in my python workspace two Modules which need sip.pyd
Module1.pyd needs sip.pyd (which implements v 8.0-8.1)
Module2.pyd needs sip.pyd (another file, that implements v6.0)

So I can't just choose the newer one, it doesn't work: I have to keep them both!

(RuntimeError: the sip module implements API v6.0 but the fbx module requires API v8.1)

How can I import a module in .pyd extension (a python dll, not editable), and specify which sip.pyd to source?

As for a workaround, I manage to do that:

  1. One sip.pyd is in my root site-packages location.
  2. If I have to import the module that need the other sip.pyd, I remove root path form sys.path, and I append the precise folder path where the other sip.pyd are.
  3. I can import my Module and restore previous sys.path.

Solution

  • Assuming you don't have a piece of code needing both files at once. I'd recommend the following:

    sip_helper.py contents:

    import sys
    import re
    from os.path import join, dirname
    def install_sip(version='6.0'):
        assert version in ('6.0', '8.0'), "unsupported version"
        keep = []
        if 'sip' in sys.modules:
           del sys.modules['sip']
        for path in sys.path:
            if not re.match('.*sip\d\.\d', path):
                keep.append(path)
        sys.path[:] = keep # remove other paths
        sys.path.append(join(dirname(__file__), 'sip-%s' % version))