python包 - 覆盖内置包和可怕的“模块xxxx已导入”警告

时间:2013-06-19 22:13:18

标签: python python-2.7 import module

我正在创建一个独立的python工具,位于一个目录中,我希望我的一些同事能够使用包含numpy和matplotlib的标准python发行版运行。我不希望他们必须安装额外的库。

─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. 如果没有任何问题,我该如何仅针对此库取消此警告

1 个答案:

答案 0 :(得分: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之前,将其放在程序中。