Python: как бороться с несколькими .pyd-зависимостями с одинаковыми именами? - PullRequest
3 голосов
/ 28 ноября 2011

У меня в рабочей области python два модуля, для которых требуется sip.pyd
Module1.pyd требуется sip.pyd (который реализует v 8.0-8.1)
Module2.pyd нужен sip.pyd (другой файл, который реализуетv6.0)

Так что я не могу просто выбрать более новый, он не работает: я должен оставить их обоих!

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

Как я могу импортировать модуль в.pyd расширение (Python DLL, не редактируемый) и укажите, какой sip.pyd к источнику?

Что касается обходного пути, мне удается сделать это:

  1. Один глоток.pyd находится в моем расположении корневых пакетов сайта.
  2. Если мне нужно импортировать модуль, которому нужен другой sip.pyd, я удаляю корневой путь из sys.path и добавляю точный путь к папке, где другойsip.pyd.
  3. Я могу импортировать мой Модуль и восстановить предыдущий sys.path.

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

Если у вас нет куска кода, требующего оба файла одновременно.Я бы порекомендовал следующее:

  • установить оба файла в 2 отдельных каталога (назовите их, например, sip-6.0 и sip-8.0), которые вы поместите в site-packages/

  • записать sip_helper.py файл с кодом, похожим на

sip_helper.py содержимое:

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))
  • положитьsip_helper.py в site_packages (родительский каталог каталогов sip-6.0 и sip-8.0)
  • вызов sip_helper.install_sip при запуске ваших программ
1 голос
/ 28 ноября 2011

VirtualEnv сделано для этих случаев.

virtualenv - это инструмент для создания изолированных сред Python.

Используя virtualenv, выбыть в состоянии создать 2 окружения, одно с sip.pyd в версии 8.x другое в версии 6.0

0 голосов
/ 28 ноября 2011

Я не знаю, работает ли это (если имя модуля должно соответствовать его содержимому), но вы не можете просто переименовать их в sip6.pyd соотв. sip8.pyd, а затем сделать

if need6:
    import sip6 as sip
else:
    import sip8 as sip

...