У меня есть пакет Python под названием zypp. Он генерируется с помощью swig, и пакет rpm (называемый python-zypp) помещает его в:
rpm -ql python-zypp
/usr/lib64/python2.6/site-packages/_zypp.so
/usr/lib64/python2.6/site-packages/zypp.py
Теперь у меня есть другой проект, который предоставляет дополнительные наборы API. Чистый питон. Плюс несколько скриптов.
Макет:
bin/script1
python
python/zypp
python/zypp/plugins.py
python/zypp/__init__.py
plugins.py содержит класс Plugin. Я намеревался поместить это в число оборотов в минуту, и поместить это в
/usr/lib64/python2.6/site-packages/zypp/plugins.py
script1 использует этот класс плагинов. Но когда я тестирую его на git, я бы хотел, чтобы он нашел модуль и на git, если он не установлен. Так что у него есть что-то вроде:
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../python'))
from zypp.plugins import Plugin
Однако, похоже, что python-zypp установлен в /usr/lib64/python2.6/site-packages/zypp.py, то script1 больше не найдет подмодуль плагинов. Если я удаляю python-zypp, он делает.
Итак, мой вопрос, возможно ли расширить модуль, добавив подмодули, которые находятся в другом пути загрузки. Или они всегда будут конфликтовать?
Аналогия была бы, у меня есть модуль foo. И я предоставляю foo.extras в другом пути загрузки (который может действительно использовать foo). Скрипт не найдет foo.extras, если foo найден первым в пути загрузки системы. Если я использую только пользовательский путь загрузки, сценарий может не найти модуль foo, если его использует foo.extras.
У меня больше опыта с ruby, но в ruby я мог бы установить:
/usr/lib64/ruby/gems/1.8/gems/foo-1.0/lib/foo/*
И я мог бы иметь в своем сценарии:
bin/script
lib/foo/extras/*
Я мог бы сделать в сценарии:
$: << File.join(File.dirname(__FILE__), "../lib"
и тогда мой сценарий может
require foo
require foo/extras
Не имеет значения, если foo / extras установлен в системе или в пользовательском пути загрузки. Они не конфликтуют.
С другой стороны, я обнаружил, что с помощью PYTHONPATH локальные zypp.plugins обнаруживаются первыми. Но тогда установленный модуль zypp не найден:
import zypp # works, but seems to import the local one
from zypp.plugins import Plugin # works, PYTHONPATH finds it first
repoinfo = zypp.RepoInfo() # does not work