Я создаю автономный инструмент python, расположенный в каталоге, который я хочу, чтобы некоторые мои коллеги могли запускается со стандартным дистрибутивом python, который включает numpy и matplotlib. Я не хочу, чтобы им приходилось устанавливать дополнительные библиотеки.Пакеты python - переопределение встроенных пакетов и страшный «Модуль xxxx уже был импортирован» предупреждение
─myprogram
| __main__.py
| [...other .py files...]
├───datafiles
├───sandbox
└───xlrd
├───doc
└───examples
Я использую xlrd
библиотеку, которую я включал в моем дистрибутиве программы таким образом, чтобы они не должны установить его.
Я протестировал свою программу, чтобы убедиться, что она работает с Enthought EPD, PortablePython и PythonXY.
В этом проблема: PythonXY можно установить с помощью библиотеки xlrd. Когда я пошел, чтобы запустить свою программу с PythonXY, я получил это предупреждение:
c:\app\python\pythonxy-2.7.5.0\lib\site-packages\scikits\__init__.py:1:
UserWarning: Module xlrd was already imported from myprogram\xlrd\__init__.pyc,
but c:\app\python\pythonxy-2.7.5.0\lib\site-packages is being added to sys.path
__import__('pkg_resources').declare_namespace(__name__)
Как я могу настроить свой исходный код так, что он импортирует только встроенную библиотеку xlrd, что я обеспечиваю, а не установлен один, если один установлен?
Разъяснение:
- Помимо печатного предупреждения, есть ли побочный эффект, который может произойти? Я хочу использовать встроенную версию xlrd, а не глобальную копию, установленную в python.
- Если нет ничего плохого, как я могу подавить это предупреждение только для этой библиотеки?
Вы пытались вставить путь к модулю в записи с более высоким приоритетом в 'sys.path', чем где бы ни была версия xlrd PythonXY? – jedwards
Просто попробовал распечатать sys.path. Локальный каталог является первым в списке. –
Вы импортируете пакет с помощью 'from myprogram.xlrd import ...'? (или 'from .xlrd import ...') – michaelmeyer