我有一个文件夹
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()
答案 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))