Как я могу использовать модули в web2py?

У меня есть некоторые функции в func.py что я хотел бы получить доступ из моего контроллера web2py под названием default.py, Я пытался импортировать и использовать func.py в default.py с "import func" и "calcotedomething = func.calculatesomething", но это не работает. Файл func.py также добавлен в раздел Модули моей программы web2py.

Почему это не работает? Как я могу заставить его работать? Должен ли модуль быть в func.py или же default/func.py или что-то другое?

2 ответа

Решение

func должен быть в месте, которое находится в PYTHONPATH (sys.path), такой как web2py/site-packages, Это правильный Pythonic способ сделать это.

Если вместо этого вы хотите упаковать свой модуль вместе с приложением, поместите его в applications/yourapp/modulesЗатем вы должны импортировать его с func = local_import('func')

Q: Люди, которые плохо знакомы с web2py, могут задаться вопросом: зачем использовать local_import() когда первый метод является стандартным в мире Python?

A: Потому что в web2py вы можете устанавливать новые приложения без перезагрузки сервера. Приложения не могут измениться sys.path потому что это не потокобезопасно и будет зависеть от порядка установки этих приложений. Более того, для двух приложений могут потребоваться модули с одинаковым именем, но разными (например, разные версии). Мы хотим избежать конфликтов между этими модулями и другими модулями, которые могут быть предварительно установлены.

local_import() это обходной путь, который позволяет вам поставлять некоторые модули с вашими приложениями и импортировать их без добавления папки в sys.path и вызывает конфликт версий.

Просто чтобы добавить немного к ответу user570039, здесь описано local_import. Включает в себя reload параметр. Согласно документации:

Когда вы указываетеreload=True, он будет повторно импортировать модуль при каждом запросе; в противном случае ваш процесс Python импортирует модуль только один раз. По умолчаниюreload=False,

В разработке, настройке reload=True может быть удобным, потому что изменения в вашем модуле будут работать немедленно, без необходимости перезапуска. Однако повторный импорт при каждом запросе снизит производительность, поэтому reload=False рекомендуется в производстве.


ОБНОВЛЕНИЕ: Вещи изменились. local_importбыл объявлен устаревшим Если у вас есть /applications/myapp/modules/mymodule.py, вы можете импортировать его в myapp, выполнив:

import mymodule

web2py проверит папку приложения "модули", прежде чем проверять остальную часть sys.path.

Для более подробной информации, смотрите здесь.

Другие вопросы по тегам