加载python模块并为其传递变量属性

时间:2018-11-27 07:28:14

标签: python-3.x

我有一个文件夹

window.open("yourURL", '_blank');

/ alphabet/ __init__.py a.py b.py ... main.py 中的模块对我来说必须是未知的,并且我想在从main.py导入时访问它们,所以alphabet/就是这样

alphabet/__init__.py

from os import listdir, path onlyfiles = [f for f in listdir('alphabet') if path.isfile(path.join("alphabet", f))] __all__ = [f[:-3] for f in onlyfiles if f != '__init__.py' and f[-2:] == "py"] 怎么称呼他们

main.py

import alphabet modules = [l for l in alphabet.__all__] print(modules)

现在我想从["a", "b", ...]运行一个名为sound()的函数

a.py

但是它给出了此错误for m in modules: alphabet.m.sound()

2 个答案:

答案 0 :(得分:0)

这有很多错误,很难开始。您可以参考以下内容开始调试应用程序:

for循环中,您不能以点分符号使用变量m,因为解释器将尝试访问原义的m模块而不是变量名。一种有效的尝试方法是调用alphabet.__all__[m].sound()。但这实际上不起作用,因为您从未导入过那部分代码。正确的方法是使用importlib模块并动态加载子模块,例如

import importlib
module = importlib.import_module('alphabet.a')

如何构建import_module的function属性取决于您。 此外,将子模块名称放入__all__中只会将其暴露给导入器(或将其隐藏),而实际上不会在运行时导入它们。您必须使用import * from alphabet来导入__all__中的所有子模块。

我强烈建议您研究python的软件包开发并返回到此。

答案 1 :(得分:0)

我找到了一个更简单的解决方案,其中使用eval()

for m in modules:
    eval('alphabet.{}.sound()'.format(m))