Как я могу использовать модули в 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.
Для более подробной информации, смотрите здесь.