Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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.

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