首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用python脚本作为CGI时,Subprocess无法运行后台进程

当使用python脚本作为CGI时,Subprocess无法运行后台进程
EN

Stack Overflow用户
提问于 2019-05-22 16:14:56
回答 1查看 494关注 0票数 0

我正在尝试从CGI Python脚本在后台运行另一个python脚本,并希望这个脚本能够在后台运行进程,而无需等待其他脚本的完成。不知为何,当我在Linux中运行相同的脚本时,我可以在后台运行另一个python脚本。但是,当我尝试通过CGI执行同样的操作时,前端一直在加载,直到其他脚本完成,而不仅仅是让它在后台运行。

我尝试过在Linux Shell上运行同样的程序,而且它可以工作。当我转到CGI时,也就是脚本等待其他进程完成的时候。

python1.py:

代码语言:javascript
复制
command = [sys.executable,'python2.py', str(senddata)]
proc=subprocess.Popen(command,shell=False,stdin=None,stdout=None,stderr=None,close_fds=True)

print("Content-type: text/html\r\n\r\n")

print("The script is running in background! Expect an email in 10 minutes.")

python2.py:这个脚本需要2-5分钟才能执行,然后发送一封电子邮件给小组。

预期的输出将包含以下消息:

脚本正在后台运行!期待在10分钟内收到一封电子邮件。

并在后台运行python2.py,而无需等待它完成。

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 00:44:43

and服务器将保持客户端响应活动(导致客户端处于“加载”状态),直到收集了来自CGI程序的所有输出并将其转发给客户端。way服务器知道所有输出已经被收集的方式是它看到CGI进程的标准输出流正在关闭。这通常发生在CGI进程退出时。

出现此问题的原因是,当subprocess.Popen被告知使用stdout=None执行程序时,生成的程序将共享其父程序的标准输出流。这里,这意味着您的后台程序共享CGI进程的标准输出。这意味着从the服务器的角度来看,流一直处于打开状态,直到两个进程都退出为止。

若要修复,请使用stdout=subprocess.PIPE启动后台进程。如果背景进程在CGI进程死后其stdout关闭,则尝试使用stdout=open('/dev/null')启动它。

后台进程的stdinstderr将有相同的问题;它们将与CGI进程共享。只要后台进程不尝试从它的标准输入中读取,AFAIK共享这些就不会带来麻烦,但是如果它这样做了(或者您只是想要谨慎),您可以像对待stdout一样对待它们,或者将它们设置为subprocess.PIPE,或者将它们与/dev/null关联起来。

更多细节见https://docs.python.org/2/library/subprocess.html#popen-constructor

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56261101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档