[英]Cant get __import__() to dynamically import a module in python - I know this cause it doesn't show up in sys.modules
我寫了一個小腳本。 它旨在在python目錄中搜索所有可用模塊(無論是否已安裝),然后檢查當前正在加載的模塊,然后提供一個選項來動態加載您選擇的模塊。 后者使用__import__()
因為我正在__import__()
傳遞一個字符串-(這是我遇到的問題-但我很快會再__import__()
它)...然后,它提供了“瀏覽”該模塊的選項其所有類,函數等(使用dir([module name])
...)。
問題:
動態加載模塊時-嵌入在try/except
語句中-如果成功加載,則報告“模塊已加載”;如果加載失敗,則報告... duh ...“加載失敗...”
如果鍵入模塊的名稱,例如,名為“ uu”的模塊,則會顯示“ loaded”。 所以我知道它正在加載-但是,當我返回並調用檢查所有LOADED模塊的函數時-它為空(使用sys.modules
)
我在想python正在將模塊加載到不是sys.modules
的臨時位置,因為當我退出腳本並檢查sys.modules
它不存在。
Nascent_Notes,不錯的腳本! 我嘗試加載uu
(命令3)並打印已加載模塊的列表(命令2),它們似乎都可以正常工作。
但是,如果嘗試“瀏覽模塊”(命令4),則會出現以下錯誤:
HlpWiz>>> 4
What module do you want to look more into?: uu
*An error occurred - probably because the module isn't loaded or is misspelled*
嘗試跑步
#!/usr/bin/env python
import sys
__import__('uu')
print(sys.modules['uu'])
print(dir(uu))
您應該得到NameError: name 'uu' is not defined
。
因此看來,雖然__import__
成功導入了uu
模塊,它不添加uu
向全局命名空間-模塊uu
無法通過變量名來訪問uu
。 可以通過sys.modules
訪問它:
因此,改變
var_mod = input("What module do you want to look more into?: ")
print "\n attempting to browse... please wait!"
time.sleep(2)
browse_mod(zlib = var_mod)
至
var_mod = raw_input("What module do you want to look more into?: ")
print "\n attempting to browse... please wait!"
time.sleep(2)
browse_mod(zlib = sys.modules[var_mod])
使用raw_input
不僅比input
安全得多(用戶將無法執行意外的/惡意的命令),而且raw_input
還能滿足您的要求。
略微注意,您也可以更改
i = 1
for line in sample:
print i, line
i = i + 1
到更pythonic
for i,line in enumerate(sample):
print i+1, line
編輯 :
sys.modules是字典(字典的縮寫)。 字典就像電話簿一樣,您給它起一個名字(更好地稱為“鍵”),然后它返回一個電話號碼(或更一般地,一個“值”)。
對於sys.modules,鍵是模塊名稱(字符串)。 值是模塊對象本身。
您可以使用方括號符號訪問字典中的值。 所以uu
只是一個字符串,但是sys.modules['uu']
是模塊uu
。
您可以在此處閱讀有關dict的完整故事: http : //docs.python.org/tutorial/datastructures.html#dictionaries
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.