2

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

问题:

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

如果您键入一个模块的名称,例如一个名为“uu”的模块,它会显示“已加载”。所以我知道它正在加载 - 但是,当我返回并调用检查所有 LOADED 模块的函数时 - 它是空白的(使用sys.modules

我在想 python 正在将模块加载到一个临时位置,这不是sys.modules因为当我退出脚本并检查sys.modules它不存在时。

4

1 回答 1

1

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_inputinput(用户将无法执行意外/恶意命令)更安全,而且还raw_input可以在这里做你想做的事。

稍微注意一下,您还可以更改

i = 1
for line in sample:
    print i, line
    i = i + 1

更蟒蛇

for i,line in enumerate(sample):
    print i+1, line

编辑

sys.modules 是一个字典(字典的缩写)。字典就像电话簿——你给它一个名字(更好地称为“键”),它返回一个电话号码(或更一般地说,一个“值”)。

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

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

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

于 2009-12-28T12:48:13.910 回答