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

Posted

技术标签:

【中文标题】如何在 Python 中运行另一个脚本而不等待它完成? [复制]【英文标题】:How do I run another script in Python without waiting for it to finish? [duplicate] 【发布时间】:2010-10-07 10:58:15 【问题描述】:

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

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

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

【问题讨论】:

Starting a background process in pythonHow to launch and run external script in background? 的可能重复项 【参考方案1】:
p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

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

阅读文档here。

【讨论】:

nosklo:谢谢。我如何将参数传递给脚本? 列表中的其他元素作为第一个参数传递。链接的文档很有用,并且链接到是有原因的。 在非windows环境下,也可以查看os.fork 德文:谢谢。我在这里问是因为我很难从文档中弄清楚这一点。我在文档中的任何地方都没有看到 sys.executable。如果我们只需要文档,我们就不需要 SO =) @sheats: sys.executable 记录在这里docs.python.org/library/sys.html#sys.executable【参考方案2】:

subprocess.Popen 确实是您正在寻找的。​​p>

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

celery (pypi.python.org/pypi/celery) 也很适合这个。它使用 RabbitMQ(对于消息持久性,如果有人有时间,当然可以使用 beanstalkd 的胡萝卜后端) beanstalkd 教程只解决了其中一个问题,发送消息,但将实际执行任务留给读者作为练习。

以上是关于如何在 Python 中运行另一个脚本而不等待它完成? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中与另一个命令行程序交互

Python脚本在执行另一个脚本之前等待

如何在批处理脚本中等待? [复制]

多次调用一个函数而不等待它完成

如何在python中停止另一个已经运行的脚本?

如何在另一个脚本中运行 Python 脚本并立即关闭自身