Есть ли способ обойти проблему импорта версии конфликта, вызванную Pyxb
У меня есть 3 проекта Python. Проект A, проект B и проект C. Проект C зависит от объектов A и B
Project C --- depends ---> Project A
Project C --- depends ---> Project B
И проект A, и проект B все зависят от PyXB, они используют какой-то сгенерированный модуль схемы. К сожалению, проект A использует PyXB 1.2.2, а проект B использует PyXB 1.2.3.
Project A --- depends ---> PyXB 1.2.2
Project B --- depends ---> PyXB 1.2.3
Если вы прочитаете эти модули, вы увидите
# Version of PyXB used to generate the bindings
_PyXBVersion = '1.2.3'
# Generated bindings are not compatible across PyXB versions
if pyxb.__version__ != _PyXBVersion:
raise pyxb.PyXBVersionError(_PyXBVersion)
а также
# Version of PyXB used to generate the bindings
_PyXBVersion = '1.2.2'
# Generated bindings are not compatible across PyXB versions
if pyxb.__version__ != _PyXBVersion:
raise pyxb.PyXBVersionError(_PyXBVersion)
Итак, на данный момент Project C имеет проблему конфликта версий
Project C --- depends ---> PyXB 1.2.2
^
|
X conflict
|
v
Project C --- depends ---> PyXB 1.2.3
И так как эти модули схемы были изменены вручную. Трудно их регенерировать и применять те же модификации. Поэтому мне интересно, возможно ли импортировать один и тот же модуль с другой версией в Python. Например, я предполагаю, что это может быть что-то вроде
with import_routing('pyxb', '..packages.pyxb1_2_3'):
import project_a
есть ли такой инструмент? или есть другой обходной путь, который я могу использовать в этой ситуации?
1 ответ
Не легко. Привязки действительно делают предположения о базовом API, представленном конкретной версией PyXB. Вероятно, есть какая-то магия, которую вы могли бы сделать, изменив метаданные модуля, чтобы позволить двум версиям сосуществовать, если документ не ссылается на привязки из обоих пространств имен.
К сожалению, сгенерированные привязки были изменены вручную. Во многих случаях использование инфраструктуры настройки PyXB устранит эту тесную связь, и в этом случае вы можете заново сгенерировать привязки и повторно использовать настройки, которые их накладывают.