Python 子流程赢得';如果它是由WSGI脚本创建的,则不能退出

Python 子流程赢得';如果它是由WSGI脚本创建的,则不能退出,python,subprocess,wsgi,Python,Subprocess,Wsgi,我有一个web应用程序的代码片段,如果我从命令行执行它,就可以正常运行和退出。但是,如果它是由http请求发出的,则子进程将不会退出 导入子流程 def test_build(): msg='msg' make_code='/opt/arduino/arduino builder-compile-和许多其他选项-verbose/tmp/arduino-sketch-7c17cb3749d67dadaded5c7edc6ca63b/main.ino' 尝试: ps=子流程.Popen(make_c

我有一个web应用程序的代码片段,如果我从命令行执行它,就可以正常运行和退出。但是,如果它是由http请求发出的,则子进程将不会退出

导入子流程
def test_build():
msg='msg'
make_code='/opt/arduino/arduino builder-compile-和许多其他选项-verbose/tmp/arduino-sketch-7c17cb3749d67dadaded5c7edc6ca63b/main.ino'
尝试:
ps=子流程.Popen(make_code,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
msg=ps.stderr.read()
exc_代码=ps.等待()
#打印(msg)#仅用于调试
#打印(exc_代码)
例外情况除外,如e:
打印(“生成错误”,str(e)+msg)
test_build()
只有在将特定代码添加到
main.ino
时才会发生这种情况

在我将
subprocess.Popen(make_-code,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
更改为
subprocess.Popen(make_-code,stderr=subprocess.PIPE,shell=True)
后,问题就消失了,但我不明白为什么会发生这种情况


如果子流程由web应用程序分叉,那么它有什么区别吗?

我猜该流程正在生成大量标准输出文本。如果它指向一个管道,但您没有读取管道的末端,那么进程很快就会阻塞,无法完成。@jasonharper您的意思是,如果从命令行运行,子进程将通过管道传输到shell的标准输出,但如果通过http请求创建,则不会?我设置了
shell=True
,我认为它应该与从命令行运行相同。无论是
shell=
选项还是运行代码的环境都不会有任何区别。我认为区别完全在于您告诉arduino builder要做什么:编译一个不生成任何警告的简单程序可能会产生很少的输出,使其完全适合管道的缓冲区,因此不会阻止该过程。您可能应该使用
ps.communicate()
同时读取STDOUT和STDERR,这样问题就不会发生。我的意思是,即使使用相同的main.ino文件可能会阻止web应用程序的进程,当我从命令行运行时,上述脚本也可以正常退出。可能是因为这两个环境的输出缓冲区大小不同?