如何在Python中运行另一个脚本而不等待它完成?

时间:2009-02-13 13:56:29

标签: python django process background subprocess

我正在为用户创建一个小仪表板,以便他能够运行特定的工作。我正在使用Django所以我希望他能够单击一个链接来启动作业,然后将页面返回给他,并显示作业正在运行的消息。这份工作的结果将在稍后通过电子邮件发送给他。

我相信我应该使用subprocess.Popen,但我不确定。所以在伪代码中,这就是我想要做的事情:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'

4 个答案:

答案 0 :(得分:62)

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

这将在后台启动子进程。您的脚本将继续正常运行。

阅读文档here

答案 1 :(得分:6)

如果您正在考虑长期扩展,那么通过消息队列运行它绝对是可行的方法。将消息发送到后台不断运行的队列,并编写作业处理程序来处理不同类型的消息。

由于您使用的是Django,我认为Beanstalkd非常合适。 Here's关于这个主题的非常好的教程。该文章中的第一条评论也有一些很好的提示。

就个人而言,我已经推出了一个用Erlang编写的自定义内存中队列服务器,其中Python绑定用C语言编写。但是redis看起来可能会成为未来排队/消息传递的有力竞争者 - 需要。希望这有帮助!

答案 2 :(得分:3)

subprocess.Popen确实是你要找的。

答案 3 :(得分:1)

虽然如果您发现要在子进程和父进程之间开始传递大量信息,您可能需要考虑一个线程或RPC框架,如Twisted。

但很可能那些对你的申请来说太重了。