Как использовать модули в web2py?
У меня есть некоторые функции в func.py
, которые я хотел бы получить с моего контроллера web2py под названием default.py
. Я попытался импортировать и использовать func.py
в default.py
с "import func" и "calculatesomething = func.calculatesomething", но это не сработает. Файл func.py
также добавляется в разделе "Модули" моей программы web2py.
Почему он не работает? Как я могу заставить его работать? Должен ли модуль находиться в func.py
или default/func.py
или что-то еще?
Ответы
Ответ 1
func
должен находиться в месте, которое находится в PYTHONPATH
(sys.path), например web2py/site-packages
. Это правильный питонический способ сделать это.
Если вместо этого вы хотите упаковать свой модуль с вашим приложением, а затем поместите его в applications/yourapp/modules
, затем вы должны импортировать его с помощью func = local_import('func')
Q: Люди, которые не знакомы с web2py, могут задаться вопросом: зачем использовать local_import()
, когда первый метод является стандартным в мире Python?
A:. В Web2py вы можете устанавливать новые приложения без перезагрузки сервера. Приложения не могут изменить sys.path
, поскольку они не являются потокобезопасными и будут зависеть от порядка установки этих приложений. Кроме того, для двух приложений могут потребоваться модули с одинаковым именем, но разные (например, разные версии). Мы хотим избежать конфликтов между этими модулями и другими модулями, которые могут быть предварительно установлены.
local_import()
- это обходной путь, который позволяет отправлять некоторые модули с вашими приложениями и импортировать их, не добавляя папку в sys.path
и вызывая конфликты версий.
Ответ 2
Чтобы добавить немного к user570039 ответ, local_import документально зарегистрирован здесь. Он включает параметр reload
. Согласно документации:
Когда вы укажете reload=True
, он будет повторно импортировать модуль по каждому запросу; иначе ваш процесс python будет импортировать только один модуль. По умолчанию используется reload=False
.
В разработке настройка reload=True
может быть удобной, так как изменения в вашем модуле будут работать немедленно, не требуя перезагрузки. Однако повторный импорт по каждому запросу замедляет производительность, поэтому reload=False
рекомендуется при создании.
ОБНОВЛЕНИЕ: Все изменилось. local_import
устарел. Если у вас есть /applications/myapp/modules/mymodule.py, вы можете импортировать его в myapp, выполнив:
import mymodule
web2py проверит папку "modules" приложения, прежде чем проверять остальную часть sys.path.
Подробнее см. здесь.