首页 > 解决方案 > 如何在烧瓶上运行子进程

问题描述

我目前运行一个烧瓶应用程序,它在注册后为用户创建一个 docker 文件,我如何使用子进程在后台启动docker-compose up -d进程我创建了一个函数 start(),我在之后调用用户单击我的注册表单上的提交按钮

command = 'docker-compose up -d'

def  start(command):
   subprocess.run(shlex.split(command), cwd=dir, check=True)

但我注意到注册不起作用,因为它正在等待进程在后台完成,我想要的是用户完成表单,然后当用户点击注册按钮时,它应该调用 start()功能,然后显示我的感谢页面

标签: pythonflasksubprocess

解决方案


根据子流程文档(https://docs.python.org/3/library/subprocess.html#subprocess.run),运行将等待命令完成,然后返回 CompletedProcess 实例。如果你想解决这个问题,你应该给它自己的线程,这将允许 Flask 请求完成(并且你的用户可以获得感谢页面。


import threading

def start(command):
   subprocess.run(shlex.split(command), cwd=dir, check=True)

@app.route('/register')
def register():
   ...
   thread = threading.Thread(target=start, args=('docker-compose up -d',))
   thread.start()
   return jsonify(msg='success'), 200

推荐阅读