我正在开发一个简单的Flask应用程序,并且我有一个可以根据要求创建bash会话的端点。我希望即使杀死烧瓶也能保留该过程。
该过程从subprocess.Popen()
开始使用,即使在终端上执行killall python
之后,我也希望它继续存在。
我尝试在preexec_fn=os.setsid
上设置preexec_fn=setpgrp
和Popen
参数,但是运行killall
仍然会杀死我在Flask应用程序中创建的bash shell。
相关代码:
def run_command(command):
Process.proc = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
preexec_fn=os.setsid,
)
run_command(['bash', '-c', 'for((i=0;i<1000;i++)); do echo $i; sleep 1; done; echo EOF'])
任何指针,我将不胜感激。谢谢。
答案 0 :(得分:0)
您可能不希望直接使用Popen,而要使用文档(17.5.1)中recommended的subprocess.run()。
# Python3.5 or above:
from subprocess import PIPE, run
def run_command(cmd:str):
run(cmd, universal_newlines=True)
def run_piped_command(cmd:str):
result = run(cmd, stdout=PIPE, stderr=PIPE, universal_newlines=True)
return result.stdout, result.stderr
如果不按照@metatoaster的说明通过管道传递输出,进程将继续执行,并且如果您运行killall python
命令,它将输出一条不错的python: no process found
消息。