2013-06-19 2 views
2

Я создаю автономный инструмент 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, что я обеспечиваю, а не установлен один, если один установлен?


Разъяснение:

  1. Помимо печатного предупреждения, есть ли побочный эффект, который может произойти? Я хочу использовать встроенную версию xlrd, а не глобальную копию, установленную в python.
  2. Если нет ничего плохого, как я могу подавить это предупреждение только для этой библиотеки?
+0

Вы пытались вставить путь к модулю в записи с более высоким приоритетом в 'sys.path', чем где бы ни была версия xlrd PythonXY? – jedwards

+0

Просто попробовал распечатать sys.path. Локальный каталог является первым в списке. –

+0

Вы импортируете пакет с помощью 'from myprogram.xlrd import ...'? (или 'from .xlrd import ...') – michaelmeyer

ответ

2

Переименовать myprogram\xlrd в myprogram\frozen_xlrd. Затем импортировать его с

try: 
    import xlrd 
except ImportError: 
    import frozen_xlrd as xlrd 

В качестве альтернативы, вы можете сказать, Python, чтобы молча игнорировать этот конкретный UserWarning:

import warnings 
warnings.filterwarnings("ignore", 
         message="Module xlrd was already imported", 
         category=UserWarning) 

Место это на раннем этапе в программе до scikits импортируется.

+0

Я вернусь к этому подходу, если это необходимо, есть ли способ заставить Python импортировать только из локальной копии? –

+0

Конечно, просто 'import frozen_xlrd as xlrd' (без' try ... except'). – unutbu

+0

нет, я хочу использовать xlrd вместо этого и специально заставляю python использовать локальную копию пакета. Проблема заключается в конфликте пространства имен, и хотя я не думаю, что 'frozen_xlrd', скорее всего, даст мне конфликт имен с установленными библиотеками Python, я не могу гарантировать, что кто-то еще не установил библиотеку' frozen_xlrd', которая оставит меня с той же проблемой. –

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