gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:32 25 4
gpt4 key购买 nike

我写了一个小脚本。它旨在搜索 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_inputinput 更安全(用户将无法执行意外/恶意命令),而且 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

关于python - 无法让 __import__() 在 python 中动态导入模块——我知道这是因为它没有出现在 sys.modules 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1969097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com