2013-06-19 36 views
2

我正在創建一個自包含的python工具,位於一個目錄中,我希望我的一些同事能夠使用包含numpy和matplotlib的標準python發行版運行。我不希望他們必須安裝額外的庫。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'的更高優先級條目中,而不是PythonXY的xlrd版本的位置? – jedwards

+0

剛試過打印出sys.path。本地目錄是列表中的第一個。 –

+0

你用'from myprogram.xlrd import ...'導入包嗎? (或'from .xlrd import ...') – michaelmeyer

回答

2

將名稱myprogram\xlrd更名爲myprogram\frozen_xlrd。在節目早期就

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

廣場前scikits被進口: 然後用

try: 
    import xlrd 
except ImportError: 
    import frozen_xlrd as xlrd 

或者導入它,你可以告訴Python忽略該特定UserWarning

+0

如果必須的話,我會回到這個方法,是否有強制Python只從本地副本導入? –

+0

當然,只需'將frozen_xlrd導入爲xlrd'(沒有'try ... except')。 – unutbu

+0

不,我的意思是使用xlrd來代替,特別是強制python使用包本地副本。問題是命名空間衝突之一,雖然我不認爲'frozen_xlrd'可能會給我一個與安裝的Python庫的命名空間衝突,但我不能保證其他人沒有安裝'frozen_xlrd'庫會讓我面臨同樣的問題。 –

相關問題