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

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

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

 if job == 1: run script in background: /path/to/script.py return 'Job is running' 
 p = subprocess.Popen([sys.executable, '/path/to/script.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

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

阅读这里的文档。

通过消息队列运行这个过程当然是要走的路,如果你正在考虑长期扩展。 向在后台不断运行的队列发送消息,并写入作业处理程序来处理不同types的消息。

既然你使用的是Django,我认为Beanstalkd是一个非常好的select。 这是关于这个主题的一个很好的教程。 那篇文章的第一条评论也有一些好的提示。

就我个人而言,我已经使用用Erlang编写的定制内存队列服务器进行了编译,使用了用C语言编写的Python绑定。但是, redis看起来可能会成为未来排队/消息传递需求的有力竞争者。 希望这可以帮助!

subprocess.Popen确实是你在找什么。

尽pipe如果你发现你想开始在subprocess和父进程之间传递一堆信息,你可能需要考虑一个线程,或者像Twisted这样的RPC框架。

但很可能这些对您的应用来说太重了。