我有一些位于func.py
中的函数,我想从我的web2py控制器default.py
中访问这些函数。我尝试使用"import func"和"calculatesomething = func.calculatesomething"在default.py
中导入并使用func.py
,但它不起作用。文件func.py
也添加在我的web2py程序的模块部分。
为什么它不起作用?我该如何使其起作用?模块应该是func.py
,还是default/func.py
或其他什么位置?
补充一下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”文件夹。
更多详细信息,请参见此处。
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
以及引起版本冲突的情况下导入它们。
/applications/myapp/modules/fuzzywuzzy/
目录中导入名为fuzz
和process
的模块时,在GAE上使用Py2.7并使用from fuzzywuzzy import fuzz, process
命令时,会出现一个ImportError
错误,显示<type 'exceptions.ImportError'> No module named fuzzywuzzy
。 - S Pweb2py/site-packages/fuzzywuzzy
目录下,现在可以成功导入 :) ... 但是我仍然对将模块放在web2py/applications/myapp/modules/
目录下的可能性感兴趣,特别是因为我不想在更新新应用程序的模块时意外破坏我的旧应用程序。 - S P__init__.py
文件? - Anthonyreload=True
,我认为完整的答案应该包括提到from gluon.custom_import import track_changes; track_changes(True)
作为reload=True
功能的替代。 - User