2015-11-05 5 views
0

Мне нужна помощь в следующей ситуации. Существует один проект, требующий двух версий одной библиотеки. Пусть этот lib будет lib, а его версии: libold и libnew. Эти библиотеки недоступны через pypi, т. Е. Каждый из них находится в своей собственной папке. Пусть пути этих папок будут /путь/в/libold и /путь/в/libnew.Использование двух версий одной библиотеки в одном проекте Python

В моем проекте мне нужны экземпляры классов из обеих этих библиотек, но я не могу импортировать их обоих, но только из старой или новой библиотеки.
Я попробовал следующий метод:

import sys 
sys.path.insert(0,'path/to/libold') 
import lib as libold 
sys.path.pop(0) 
sys.path.insert(0,'path/to/libnew') 
import lib as libnew 

После выполнения этой команды, libold и libnew представляет ту же самую библиотеку, libold.

Я также пробовал importlib и imp и получил тот же результат.

Как я могу выполнить импорт двух версий lib?

+0

Почему вы не импортируете только те классы, которые вам нужны? –

+0

Под «lib» вы подразумеваете модуль python или расширение C? Это пакет со многими .py файлами? – tdelaney

+0

Вы тестировали это 'sys.path.insert (0, 'путь/to/libnew'); import lib как libnew' фактически импортирует новую версию? Никакое преступление не предназначено. Мне кажется, что ваш код должен работать, поэтому я просто хочу быть уверенным. – saulspatz

ответ

0

Python добавляет импортированные модули к sys.modules. Когда вы пишете import lib as libnew, sys.modules['lib'] уже существует, и поэтому новая библиотека не импортируется.

Чтобы импортировать новую LIB, вы должны удалить старую из sys.modules, как это:

import sys 
sys.path.insert(0, 'path/to/libold') 
import lib as libold 
sys.path.pop(0) 
del sys.modules['lib'] 
sys.path.insert(0, 'path/to/libnew') 
import lib as libnew 

Однако, вы можете столкнуться с серьезными проблемами, делая это. В частности, если старая библиотека пытается импортировать подмодуль (скажем, lib.submodule), вместо этого он получит новый. По этой причине вам лучше импортировать все подмодули старой библиотеки перед удалением sys.modules['lib'] и перед импортом нового.

Однако это грязный хак, а не реальное решение. В Python модули и пакеты идентифицируются по имени, а не по пути. Вот как это работает и всегда работало, и вы ничего не можете с этим поделать.

Вместо этого воспользуйтесь multiprocessing, чтобы преодолеть эти «ограничения». С помощью multiprocessing вы можете запускать два процесса: один, который использует старый lib, а другой - новый. multiprocessing дает вам множество инструментов, облегчающих межпроцессное общение.

Смежные вопросы