добавление подпакета из другого пути - PullRequest
1 голос
/ 30 сентября 2010

У меня есть пакет 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

1 Ответ

2 голосов
/ 30 сентября 2010

Если я правильно понимаю ваш вопрос, вы хотите использовать разрабатываемую версию этого модуля вместо установленного модуля.Следовательно, вы можете использовать

  1. PYTHONPATH

    Из документации Путь поиска модуля :

    Когда импортируется модуль с именем spam, интерпретатор ищет файл с именем spam.py в текущем каталоге, а затем в списке каталогов, заданных переменной среды PYTHONPATH.Он имеет тот же синтаксис, что и переменная оболочки PATH, то есть список имен каталогов.Если PYTHONPATH не задан или файл там не найден, поиск продолжается по пути, зависящему от установки;в Unix это обычно.: / usr / local / lib / python.

    Итак, если бы дерево GIT каталога модулей было "/ home / username / some / path", вы быизмените PYTHONPATH на "/ home / username / some / path".Или, если переменная PYTHONPATH уже используется, вы должны добавить к ней «: / home / username / some / path» (обратите внимание на разделитель двоеточий).Чтобы сделать это постоянным, добавьте в файл строку «PYTHONPATH = значение» /etc/environment".

  2. sys.path.insert

    Если у вас есть стартовый скрипт для вашей программы, вы можете переопределить путь поиска модуля, используя sys.path.insert(0, "somepath").Это похоже на описанный вами sys.path.append вызов, но вставляет путь в начало списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...