【问题标题】:How can I use modules in web2py?如何在 web2py 中使用模块?
【发布时间】:2011-06-07 03:32:56
【问题描述】:

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

为什么它不起作用?我怎样才能让它工作?模块应该在func.pydefault/func.py 还是别的什么?

【问题讨论】:

    标签: function module import include web2py


    【解决方案1】:

    只是在 user570039 的回答中添加一点,local_import 记录在 here。它包括一个reload 参数。根据文档:

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

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


    更新:情况发生了变化。 local_import 已被弃用。如果你有 /applications/myapp/modules/mymodule.py,你可以在 myapp 中导入它:

    import mymodule
    

    web2py 将在检查 sys.path 的其余部分之前检查应用程序的“模块”文件夹。

    更多详情请见here

    【讨论】:

    • 谢谢你们!这两个答案都非常有帮助!
    • 如何对文件夹执行此操作?例如,当我尝试从/applications/myapp/modules/fuzzywuzzy/ 目录中的/applications/myapp/modules/fuzzywuzzy/ 库中导入名为fuzzprocess 的模块时,在带有Py2.7 的GAE 上使用from fuzzywuzzy import fuzz, process,我得到一个ImportError<type 'exceptions.ImportError'> No module named fuzzywuzzy
    • 我把它放在web2py/site-packages/fuzzywuzzy 中,现在可以导入它们了:) ...但我仍然对将模块放在web2py/applications/myapp/modules/ 目录中的可能性感兴趣,特别是因为我没有当我为较新的应用程序“更新”我的模块时,我不想意外地破坏我的旧应用程序。
    • web2py 如果你把它放在 modules 文件夹和 from applications.myapp.modules.fuzzywuzzy import fuzz, process 也应该可以工作
    • 由于原始答案提到了reload=True,我认为要获得完整的答案,更新应该包括提及from gluon.custom_import import track_changes; track_changes(True) 作为reload=True 功能的替代品
    【解决方案2】:

    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 并导致版本冲突。

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多