我写了一个小脚本。它旨在搜索 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
