Можно ли «импортировать * из DIRECTORY», а затем каким-либо образом (во всяком случае) перебирать загруженные модули? - PullRequest
0 голосов
/ 20 февраля 2011

Позвольте мне объяснить пример использования ...

В простой среде веб-приложений на python, разработанной для Google App Engine, я бы хотел, чтобы мои модели загружались автоматически из каталога моделей, поэтому вседля добавления модели в приложение необходимо поместить файл user.py (например), который содержит класс «User», в каталог «models /».

Будучи GAE, я могу 'не могу читать из файловой системы, поэтому я не могу просто прочитать имена файлов таким образом, но мне кажется, что я должен иметь возможность «импортировать * из моделей» (или некоторый эквивалент) и получить хотя бы список имен модулейкоторые были загружены, так что я могу подвергнуть их дальнейшей логике обработки.

Чтобы было ясно, я хочу, чтобы это было сделано БЕЗ необходимости вести отдельный список имен этих модулей для приложения, чтобы читать из него.

Ответы [ 3 ]

4 голосов
/ 20 февраля 2011

Вы можете читать из файловой системы в GAE просто отлично;вы просто не можете записать в файловую систему.

from models import * будет импортировать только модули, перечисленные в __all__ в models/__init__.py;нет автоматического способа импортировать все модули в пакете, если они не объявлены частью пакета.Вам просто нужно прочитать каталог (что вы можете сделать) и __import__() все в нем.

1 голос
/ 20 февраля 2011

Позвольте мне начать с того, что я не знаком с 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()

Кроме того, если вы хотите выполнить итерации по этим модулям, вы можете изменить функцию load_modules, чтобы она возвращала список загруженных объектов модуля, добавив вызов 'imp.load_source (..)' в список.

Надеюсь, это поможет.

1 голос
/ 20 февраля 2011

Как объяснено в руководстве по Python , вы не можете загрузить все файлы .py из каталога, если не добавите их вручную в список с именем __all__ в файле __init__.py.Одна из причин, почему это невозможно, заключается в том, что он не будет хорошо работать в файловых системах без учета регистра - Python не будет знать, в каком случае следует использовать имена модулей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...