我在func.py
中有一些函数可供我从我的web2py控制器default.py
访问。我尝试使用“import func”和“calculateomething = func.calculatesomething”在func.py
中导入并使用default.py
,但它不起作用。文件func.py
也会添加到我的web2py程序的模块部分中。
为什么它不起作用?我怎样才能让它发挥作用?模块应该在func.py
还是default/func.py
还是其他什么?
答案 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
并导致版本冲突。