【发布时间】:2009-12-30 03:01:33
【问题描述】:
嗯,我想使用 WEb2Py,因为它非常好.. 我只需要将工作目录更改为所有模块/库/应用程序所在的目录,以便我可以使用它们。当我使用 web2py 接口/应用程序时,我希望能够导入我的真实程序。我需要这样做,而不是把我所有的应用程序和东西放在 Web2Py 文件夹中......我试图给我的程序一个 Web 前端,而不把程序放在 Web2Py 文件夹中......对不起,如果这很难理解。
【问题讨论】:
嗯,我想使用 WEb2Py,因为它非常好.. 我只需要将工作目录更改为所有模块/库/应用程序所在的目录,以便我可以使用它们。当我使用 web2py 接口/应用程序时,我希望能够导入我的真实程序。我需要这样做,而不是把我所有的应用程序和东西放在 Web2Py 文件夹中......我试图给我的程序一个 Web 前端,而不把程序放在 Web2Py 文件夹中......对不起,如果这很难理解。
【问题讨论】:
在任何多线程 Python 程序(不仅是 Python)中,您都不应使用 os.chdir,并且当您运行多个线程时,您不应更改 sys.path。它不安全,因为它会影响其他线程。此外,您不应该在循环中使用 sys.path.append(),因为它可能会爆炸。
所有的 Web 框架都是多线程的,请求是循环执行的。一些 Web 框架不允许您在不重新启动 Web 服务器的情况下安装/卸载应用程序,因此如果 os.chdir/sys.path.append 仅在启动时执行,则没有问题。
在 web2py 中,我们希望能够在不重新启动 Web 服务器的情况下安装/卸载应用程序。我们希望应用程序非常动态(例如,根据 http 请求提供的信息定义模型)。我们希望每个应用程序都有自己的模型文件夹,并且我们希望应用程序之间完全分离,这样如果两个应用程序需要同一模块的不同版本,它们就不会相互冲突,因此我们提供了 API 来做到这一点(request.folder , local_import)。
您仍然可以使用普通的 os.chdir 和 sys.path.append,但您应该在线程之外进行(这不是 web2py 特定的问题)。你可以在任何你喜欢的地方使用 import,就像在任何其他 Python 程序中一样。
我强烈建议将此讨论移至 web2py 邮件列表。
【讨论】:
我必须这样做。我想从我的控制器中使用几个模块。如果您希望能够使用位于控制器模块目录中的代码,您可以使用:
# use this in your controller code
impname = local_import('module_in_modules', reload=True)
# reload true will ensure that it will re load whenever
# there are changes to the module
杰
【讨论】: