我该如何在web2py中使用模块?

20

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

为什么它不起作用?我该如何使其起作用?模块应该是func.py,还是default/func.py或其他什么位置?

2个回答

38

补充一下user570039的答案,local_import这里有文档。它包括一个reload参数。根据文档:

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

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


更新:事情已经变了。local_import已被弃用。如果你有/applications/myapp/modules/mymodule.py,你可以通过以下方式在myapp内导入它:

import mymodule

在查找sys.path的其余路径之前,web2py将检查应用程序的“modules”文件夹。

更多详细信息,请参见此处


我该如何使用文件夹来解决这个问题?例如,当我试图从/applications/myapp/modules/fuzzywuzzy/目录中导入名为fuzzprocess的模块时,在GAE上使用Py2.7并使用from fuzzywuzzy import fuzz, process命令时,会出现一个ImportError错误,显示<type 'exceptions.ImportError'> No module named fuzzywuzzy - S P
我将它放在了 web2py/site-packages/fuzzywuzzy 目录下,现在可以成功导入 :) ... 但是我仍然对将模块放在 web2py/applications/myapp/modules/ 目录下的可能性感兴趣,特别是因为我不想在更新新应用程序的模块时意外破坏我的旧应用程序。 - S P
你的/modules文件夹中是否包含一个空的__init__.py文件? - Anthony
1
如果您将web2py放入模块文件夹中,并且从applications.myapp.modules.fuzzywuzzy导入fuzz和process,它也应该可以工作。 - Charles L.
1
由于原始答案提到了 reload=True,我认为完整的答案应该包括提到 from gluon.custom_import import track_changes; track_changes(True) 作为 reload=True 功能的替代。 - User
显示剩余3条评论

28

func 必须放在 PYTHONPATH (sys.path) 中的一个位置,例如 web2py/site-packages。这是正确的 Pythonic 方法。

如果您想要将模块与您的应用程序一起打包,则应将其放在 applications/yourapp/modules 中,然后使用 func = local_import('func') 导入它。

Q:对于新手来说,他们可能会想:为什么在 Python 的世界中使用本地导入(local_import()),而不使用前面描述的标准方法呢?

A: 因为在 web2py 中,您可以在不重启服务器的情况下安装新的应用程序。应用程序不能更改sys.path,因为它不是线程安全的,取决于安装应用程序的顺序。此外,两个应用程序可能需要同名但版本不同的模块。我们希望避免这些模块之间的冲突以及与其他预安装模块之间的冲突。

local_import() 是一种解决方法,允许您将某些模块随应用程序一起发布并在不添加文件夹到 sys.path 以及引起版本冲突的情况下导入它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接