Skip to main content
 首页 » 编程设计

python之无法让 __import__() 在 python 中动态导入模块——我知道这是因为它没有出现在 sys.modules 中

2025年05月04日10hnrainll

我写了一个小脚本。它旨在搜索 python 目录以查找所有可用模块(无论是否安装),然后它应该检查当前加载了哪些模块,然后它提供了一个选项来动态加载您选择的模块。后者使用 __import__() 因为我将一个字符串传递给它 - (这是我遇到问题的地方 - 但我很快就会回到它)......然后它给出了选项“浏览”模块的所有类、函数等(使用 dir([module name]) ...)。

问题:

当动态加载模块时——它被嵌入到try/except 语句中——如果成功则报告“模块已加载”,如果失败则报告...duh。 ..”加载失败...”

如果您键入模块的名称,例如名为“uu”的模块,它会显示“已加载”。所以我知道它正在加载 - 但是,当我返回并调用检查所有已加载模块的函数时 - 它是空白的(使用 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 是一个 dict(dictionary 的缩写)。 Dicts 就像电话簿——你给它一个名字(更好地称为“键”),它返回一个电话号码(或更一般地说,一个“值”)。

对于 sys.modules,键是模块名称(字符串)。这些值是模块对象本身。

您可以使用括号表示法访问字典中的值。所以 uu 只是一个字符串,但是 sys.modules['uu'] 是模块 uu。

您可以在此处阅读有关听写的完整故事:http://docs.python.org/tutorial/datastructures.html#dictionaries