簡體   English   中英

無法獲得__import __()以動態地在python中導入模塊-我知道這是因為它沒有出現在sys.modules中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM