Function 如何在web2py中使用模块?

Function 如何在web2py中使用模块?,function,module,import,include,web2py,Function,Module,Import,Include,Web2py,我想从名为default.py的web2py控制器访问func.py中的一些函数。我尝试在default.py中导入并使用带有“import func”和“calculateMething=func.calculateMething”的func.py,但不起作用。文件func.py也添加到我的web2py程序的模块部分 为什么它不起作用?我怎样才能让它工作?模块应该位于func.py或default/func.py或其他位置吗?func必须位于PYTHONPATH(sys.path)中的某个位置

我想从名为
default.py
的web2py控制器访问
func.py
中的一些函数。我尝试在
default.py
中导入并使用带有“import func”和“calculateMething=func.calculateMething”的
func.py
,但不起作用。文件
func.py
也添加到我的web2py程序的模块部分


为什么它不起作用?我怎样才能让它工作?模块应该位于
func.py
default/func.py
或其他位置吗?

func
必须位于
PYTHONPATH
(sys.path)中的某个位置,例如
web2py/site packages
。这是正确的python方法

如果您想将模块与应用程序打包,然后将其放入
applications/yourapp/modules
,接下来,您应该使用
func=local\u import('func')

Q:刚接触web2py的人可能会想:为什么要使用
local\u import()
,而前者是Python世界的标准方法

A:因为在web2py中,您可以安装新的应用程序,而无需重新启动服务器。应用程序无法更改系统路径,因为它不是线程安全的,并且取决于这些应用程序的安装顺序。此外,两个应用程序可能需要具有相同名称但不同的模块(例如不同版本)。我们希望避免这些模块与可能预安装的其他模块之间发生冲突


local\u import()
是一种变通方法,它允许您将一些模块与应用程序一起发布并导入,而无需将文件夹添加到
sys.path
,也不会导致版本冲突。

只需为user570039的答案添加一点内容,本地\u import已记录在案。它包括一个
reload
参数。根据文件:

当您指定
reload=True
时,它将在每次请求时重新导入模块;否则,python进程将只导入模块一次。默认值为
reload=False

在开发中,设置
reload=True
非常方便,因为对模块的更改将立即生效,而无需重新启动。但是,在每次请求时重新导入会降低性能,因此建议在生产中使用
reload=False


更新:情况发生了变化
本地\u导入
已被弃用
。如果您有/applications/myapp/modules/mymodule.py,您可以通过以下操作在myapp中导入它:

import mymodule
web2py将先检查应用程序的“modules”文件夹,然后再检查sys.path的其余部分


有关更多详细信息,请参阅。

谢谢大家!这两个答案都非常有用!如何处理文件夹?例如,当我试图从
/applications/myapp/modules/fuzzywuzzy/
目录导入库中名为
fuzz
process
的模块时,使用
from fuzzywuzzy import fuzz,在带有Py2.7的GAE上处理
,我得到一个
importorror
没有名为fuzzywuzzy的模块
我把它放在
web2py/site packages/fuzzywuzzy
中,现在可以导入了:)。。。但我仍然对在
web2py/applications/myapp/modules/
目录中安装模块的可能性感兴趣,尤其是因为我不想在为新应用程序“更新”模块时意外损坏旧应用程序。如果将web2py放入模块文件夹并从applications.myapp.modules.fuzzyfuzzy导入fuzz,process,因为原始答案提到了
reload=True
,我认为对于一个完整的答案,更新应该包括从glion.custom\u import-track\u中提到
;track_changes(True)
作为
reload=True
功能的替代