2014-01-08 80 views
1

我試圖開發一個模擬類,在特定的應用程序(Win7,python 2.7)中替換serial導入文件名衝突

我有一個SerialHandle類,在應用數量的作品,它的工作是添加邏輯以衆所周知的串行方法,當時的想法是與具有相同名稱的虛擬文件來替換蟒蛇serial.py,所以我們不會有更改並輸入SerialHandle

現在我有Serial類就像起源這個文件,它工作正常:

serial.py 
...Serial() 

因爲我想真正模擬方法,我需要的SerialExceptionserialutil 所以我serial.py我裏面「M嘗試使用導入它:

from serial import SerialException

但作爲預期我會得到這個加薪,因爲from serial變爲L在第一OCAL文件:

Traceback (most recent call last): 
    File "C:/CROW/ATE/DUTDrivers/DD_SimulatorExample/DD_SimulatorExample.py", line 18, in <module> 
    from Utilities.Serial.SerialHandle.trunk.SerialHandle import SerialHandle 
    File "C:\CROW\ATE\Utilities\Serial\SerialHandle\trunk\__init__.py", line 4, in <module> 
    from Utilities.Simulator import serial 
    File "C:\CROW\ATE\Utilities\Simulator\serial.py", line 11, in <module> 
    from serial import SerialException 
ImportError: cannot import name SerialException 

我理解的問題是文件名,因爲在任何其他文件,將工作...

我已經試過sys.append(site-packages....serial.py)沒有運氣。

問題:

  1. 任何方式告訴解釋忽略在特定from..import本地文件?

  2. 是否有任何其他方式從絕對路徑導入?

注:

  1. 文件命名爲serial.py不是它的一個定義,以便更改名稱是不相關的決定......

  2. 重載蟒蛇序列是不一個選項也...

+0

從python源代碼複製SerialException並將其粘貼到模塊中怎麼辦? – furins

+0

@furins它肯定會工作,我問這個問題的原因是因爲我想知道是否有一些優雅的解決方案... –

+1

那麼這種方法應該是你正在尋找的:http://stackoverflow.com/questions/6031584/python import-from-builtin-library-when-module-with-same-name-exists?rq = 1(批准的答案) – furins

回答

3

您必須使用python 2.x,因爲絕對導入是python 3.x中的默認導入。

from __future__ import absolute_import 

請注意,您將需要任何隱含的相對進口的serial.py文件轉換爲:您可以通過在文件的頂部添加此使用您的serial.py文件絕對導入明確的相對進口。所以,如果你是從other_file.py,這是在同一個目錄中導入some_func,你將需要更改到:

from .other_file import some_func 

注意「」表示與當前文件相同的包中的相對導入。有關更多詳細信息,請參閱here

+0

不,他需要相反的結果。他需要始終隱式地從本地源加載,除了在他的模塊內。 – furins

+0

這就是我的答案解釋。導入'absolute_import'只會影響使用它的文件。其他人仍然會使用相對進口。 – bogatron

+0

是的,但在模塊中,他不想訪問本地文件,他想要python。 – furins