让我解释一下用例......
在为Google App Engine设计的简单python Web应用程序框架中,我想让我的模型从“models”目录自动加载,因此将模型添加到应用程序所需的只是文件用户。 py(例如),在'models /'目录中包含一个名为'User'的类。
作为GAE,我无法从文件系统中读取,因此我不能以这种方式读取文件名,但在我看来,我必须能够“从模型中导入*”(或某些等效的),并至少检索已加载的模块名称列表,因此我可以使它们进一步处理逻辑。
为了清楚起见,我希望这样做,而不必为应用程序维护这些模块名称的单独列表。
答案 0 :(得分:4)
您可以从GAE的文件系统中读取就好了;你不能写到文件系统。
from models import *
只会导入__all__
中models/__init__.py
中列出的模块;如果未将所有模块声明为包的一部分,则无法自动导入包中的所有模块。您只需要阅读目录(您可以这样做)和__import__()
其中的所有内容。
答案 1 :(得分:1)
作为explained in the Python tutorial,除非您在文件.py
中名为__all__
的列表中手动列出,否则无法从目录加载所有__init__.py
个文件。这是不可能的原因之一是它在不区分大小写的文件系统上不能很好地工作 - Python不知道在哪种情况下应该使用模块名称。
答案 2 :(得分:1)
首先我要说的是,我不熟悉Google App Engine,但以下代码演示了如何从目录导入所有python文件。在这种情况下,我从我的'example'目录导入文件,其中包含一个文件'dynamic_file.py'。
import os
import imp
import glob
def extract_module_names(python_files):
module_names = []
for py_file in python_files:
module_name = (os.path.basename(py_file))[:-3]
module_names.append(module_name)
return module_names
def load_modules(modules, py_files):
module_count = len(modules)
for i in range(0, module_count):
globals()[modules[i]] = imp.load_source(modules[i], py_files[i])
if __name__ == "__main__":
python_files = glob.glob('example/*.py')
module_names = extract_module_names(python_files)
load_modules(module_names, python_files)
dynamic_file.my_func()
此外,如果您希望迭代这些模块,您可以通过将“imp.load_source(..)”调用附加到列表来修改load_modules函数以返回已加载模块对象的列表。
希望它有所帮助。