Как я могу использовать модули в web2py? - PullRequest
20 голосов
/ 11 января 2011

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

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

Ответы [ 2 ]

35 голосов
/ 13 января 2011

Просто чтобы добавить немного к ответу пользователя570039, 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.

Подробнее см. здесь .

27 голосов
/ 11 января 2011

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() - это обходной путь, который позволяет вам отправлять некоторые модули вместе с вашими приложениями и импортировать их без добавления папки в * 1023.* и вызывает конфликт версий.

...