在Flask中,如何从具有相对路径引用的子目录运行另一个python应用程序?

在Flask中,如何从具有相对路径引用的子目录运行另一个python应用程序?,python,flask,Python,Flask,目标是在我的Flask build中添加一个独立的应用程序(它已经独立工作了),称之为app1,类似于一个模块。问题是独立应用程序位于与Flask启动位置相关的子目录中,main.py无法调用其自身的相对路径资源。文件结构如下所示: \my_flask_app\ server.py \apps\ \app1\ main.py ..resources.. \static\ \templates\ 在运行main.py之前,我已尝试os.chdir更

目标是在我的Flask build中添加一个独立的应用程序(它已经独立工作了),称之为app1,类似于一个模块。问题是独立应用程序位于与Flask启动位置相关的子目录中,main.py无法调用其自身的相对路径资源。文件结构如下所示:

\my_flask_app\
  server.py
  \apps\
    \app1\
      main.py
      ..resources..
  \static\
  \templates\
在运行main.py之前,我已尝试os.chdir更改工作目录,因为手动更新所有路径将是一件麻烦的事情,并且无法实现app1的可移植性。我从以下路线启动app1:

@app.route('/app1/run')
def app1_run():
    # launch the standalone app.
    os.chdir('apps/app1')
    import main
    return 'Clicked!'
这将导致
ModuleNotFoundError:没有名为'main'的模块
。所以,我猜chdir实际上并没有改变工作目录

当我导入apps.app1.main而不是导入main时,这会导致
ModuleNotFoundError:没有名为“hoverable”的模块(hoverable.py是由main.py导入的资源)。因此,这意味着main.py已启动,但main.py无法定位其相对资源


我可以遍历main.py并更新资源的所有路径,但这无法实现作为独立模块的目的。有更好的方法吗?谢谢。

最简单的方法是将main.py文件中的应用程序包装成一个函数,我们称之为运行应用程序的函数。然后在包含@app.route('/app1/run')视图函数的文件的顶层导入该函数。在这一点上,您所要做的就是调用函数,\u,该函数运行\u应用程序,末尾带有(),代码将在视图函数返回“Clicked!”之前执行

from apps.app1.main import function_that_runs_the_app

@app.route('/app1/run')
def app1_run():
    # launch the standalone app.
    success_message = function_that_runs_the_app()
    return success_message



(main.py file)
def function_that_runs_the_app():
    #  All your previous code would now go here inside the function.

    return 'Standalone app1 Ran Successfully!'

if __name__ == '__main__':
    function_that_runs_the_app()

谢谢你的回复。是的,包装它更干净,但不能解决从app1引用资源的问题。我使用server.py启动Flask。在app1中,main.py调用其自己目录中的相对资源,而不是从server.py调用。我可以在main.py中重做路径引用,但我想知道是否有一种方法可以“插入”app1而无需重新工具。这有意义吗?在命令行中,当我转到app1文件夹时,我可以
py main.py
并运行应用程序。我更新了上面答案中的代码。您需要将app1 main.py脚本包装到函数中,因为flask喜欢运行函数,而不是模块。将函数导入到flask路由时,main.py文件中的所有模块级引用仍应有效。我还添加了如何在从命令行运行main.py文件时更新main.py文件以运行您选择的自定义函数名。这有助于确保您仍然可以从flask上下文之外的命令行轻松地运行脚本。