2014-10-07 100 views
0

關於將陰影模塊導入陰影模塊中有類似的問題,它是而不是sys.path。這很容易;只需使用:將陰影模塊導入到sys.path中的陰影模塊

from __future__ import absolute_import 

這裏是我的問題:我的模塊sys.path它在sys.path上漲,這是故意的!

更具體地說,我正在寫一個python解釋器,它無法訪問stdin,但它可以使用Tkinter。無法訪問stdin意味着我不能只使用正常的input,raw_inputgetpass。我需要用我自己的方法來取代這些。前兩個比較容易處理 - 我只是用__builtin__替換它們。 getpass並不是那麼容易 - 用戶可能會也可能不會導入它,但是當他們這樣做時,我需要確保他們實際導入的是我的模塊,而不是標準模塊,以便我可以通過TkinterEntry而不是stdin。我處理的那部分。我無法弄清的部分是如何通過其他標準getpass,IE,getuser()應該由真正的getpass來處理。

這裏是我的嘗試:

from __future__ import absolute_import 
import sys 
pathToThisGetpass = sys.path.pop(1) # I know that the shadowing getpass is at index 1. 
import getpass as realGetpass   # Since the path doesn't contain this getpass, this should be the real one, right? 
sys.path.insert(1, pathToThisGetpass) # Put this getpass module back into the path again 

def getuser(): 
    print("I am " + str(getuser)) 
    print("I should call " + str(realGetpass.getuser)) 
    return realGetpass.getuser() 

我在這兩個打印語句僅增加了,所以我可以明白爲什麼getuser()是失敗的,我發現它會打印:

I am <function getuser at 0x026D8A30> 
I should call <function getuser at 0x026D8A30> 

加我結束了無限遞歸。

那麼...任何想法我可以解決這個問題?

要嘗試複製本,寫這樣一個我上面的文件,將其命名getpass.py,然後添加它包含您的sys.path的文件夾,然後運行:

import getpass 
getpass.getuser() 
+0

您是否嘗試過使用['imp.load_module'](https://docs.python.org/2/library/imp.html#imp.load_module)? – 9000 2014-10-07 14:51:18

+0

@ 9000 - 我沒有。這對我有用嗎?我閱讀了你鏈接的文檔,看起來有點混亂。謹慎地舉一個有效的例子作爲答案? – ArtOfWarfare 2014-10-07 14:54:43

+0

@ 9000 - 就是說,我很困惑,如果我走了那條路線,我將如何訪問帶陰影的'getpass' - 它沒有像'import ... as'的'as'部分那樣的東西。 ..'這將允許我用一個不同的名稱來引用它。 – ArtOfWarfare 2014-10-07 15:00:01

回答

1

(張貼作爲一個答案評論:)

使用imp.load_module並加載所需的模塊,忽略標準搜索。

如果你以某種方式瞭解文件的路徑導入(例如,通過在sys.path你自己的搜索),你可以打開該文件,這樣說

with open(off_path_name) as shadowed_module_file: 
    shadow_getpass = imp.load_module(
     'shadowed.getpass', # the name reported by the module, rather arbitrary 
     shadowed_module_file, # where we are reading it from 
     '', # we don't plan to reload this module normally, no suffix 
     ('', 'r', imp.PY_COMPILED) # Assuming it's getpass.pyc, use PY_COMPILED 
) 

然後使用shadow_getpass你將一個正常模塊。

錯誤處理被省略,但要捕獲適當的異常並不困難。