關於將陰影模塊導入陰影模塊中有類似的問題,它是而不是的sys.path
。這很容易;只需使用:將陰影模塊導入到sys.path中的陰影模塊
from __future__ import absolute_import
這裏是我的問題:我的模塊是sys.path
,和它在sys.path
上漲,和這是故意的!
更具體地說,我正在寫一個python解釋器,它無法訪問stdin
,但它可以使用Tkinter
。無法訪問stdin
意味着我不能只使用正常的input
,raw_input
和getpass
。我需要用我自己的方法來取代這些。前兩個比較容易處理 - 我只是用__builtin__
替換它們。 getpass
並不是那麼容易 - 用戶可能會也可能不會導入它,但是當他們這樣做時,我需要確保他們實際導入的是我的模塊,而不是標準模塊,以便我可以通過Tkinter
Entry
而不是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()
您是否嘗試過使用['imp.load_module'](https://docs.python.org/2/library/imp.html#imp.load_module)? – 9000 2014-10-07 14:51:18
@ 9000 - 我沒有。這對我有用嗎?我閱讀了你鏈接的文檔,看起來有點混亂。謹慎地舉一個有效的例子作爲答案? – ArtOfWarfare 2014-10-07 14:54:43
@ 9000 - 就是說,我很困惑,如果我走了那條路線,我將如何訪問帶陰影的'getpass' - 它沒有像'import ... as'的'as'部分那樣的東西。 ..'這將允許我用一個不同的名稱來引用它。 – ArtOfWarfare 2014-10-07 15:00:01