如何在web2py中使用模块?

时间:2011-01-11 12:14:19

标签: function module import include web2py

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

为什么它不起作用?我怎样才能让它发挥作用?模块应该在func.py还是default/func.py还是其他什么?

2 个答案:

答案 0 :(得分:35)

只需向user570039的答案添加一些内容,就会记录local_import here。它包含reload参数。根据文件:

  

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

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


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

import mymodule
在检查sys.path的其余部分之前,

web2py将检查应用程序的“modules”文件夹。

有关详细信息,请参阅here

答案 1 :(得分:27)

func必须位于PYTHONPATH(sys.path)中,例如web2py/site-packages。这是正确的Pythonic方式。

如果您希望将模块打包到您的应用,请将其放在applications/yourapp/modules中,接下来,您应该使用func = local_import('func')

将其导入

问:对于web2py不熟悉的人可能会怀疑:为什么在前一种方法是Python世界中的标准方法时使用local_import()

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

local_import()是一种解决方法,允许您随应用程序一起发送一些模块并导入它们,而无需将文件夹添加到sys.path并导致版本冲突。