Это не ответ, а расширенный комментарий.
Ситуация импорта, представленная в исходном вопросе выше, возникает не только при попытке импортировать два разных плагина.В нашем случае мы пытаемся обеспечить локальный запасной вариант для случая, когда требуемый пакет Python не установлен в текущей системе.
Общая структура проекта для MVE может выглядеть следующим образом:
.
|-- src
| `-- balla
| |-- __init__.py
| `-- hurga
| `-- __init__.py
|-- src2
| `-- balla
| |-- __init__.py
| `-- hurga2
| `-- __init__.py
`-- test.py
, где src/balla/__init__.py
и src2/balla/__init__.py
имеют одинаковый исходный код:
#!/usr/bin/env python
try:
import pkg_resources
pkg_resources.declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
.Два src/balla/hurga/__init__.py
и src2/balla/hurga2/__init__.py
пока пусты.В нашем основном скрипте test.py
:
import sys, os
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'src'))
try:
import balla.hurga2
except:
sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), 'src2'))
import balla.hurga2
мы сначала пытаемся импортировать пакет "balla.hurga2
" напрямую из системы, надеясь, что кто-то установил его правильно (например, через pip
).Первый sys.path.append
в связи с дополнительной папкой src
, попробуйте смоделировать тот факт, что установлены другие пакеты с общим пространством имен "balla" (например, balla.extended
).Но balla.hurga2
нет, поэтому объявление пространства имен "balla" прошло успешно, а фактический импорт - нет.В пути except
мы сейчас пытаемся исправить эту ситуацию, вставив локальный путь в наш резервный пакет "src2
".На новом import balla.hurga2
старая запись "balla" в диктовке sys.modules
кэшируется и остается неизменной.Это приводит к классическому сообщению об ошибке:
Traceback (most recent call last):
File "test.py", line 9, in <module>
import balla.hurga2
ImportError: No module named hurga2
Удалив кэшированную запись для пакета "balla" из sys.modules
, проблема может быть решена:
import sys, os
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), 'src'))
try:
import balla.hurga2
except:
if 'balla' in sys.modules:
del sys.modules['balla']
sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), 'src2'))
import balla.hurga2
Дополнительная-clause требуется для систем, в которых пакет balla
отсутствует вообще.