Python,使用os.system - Python脚本有没有一种方法可以在不等待调用完成的情况下继续前进?

6
我正在尝试使用Python(通过Django框架)进行Linux命令行调用,已经尝试了os.system和os.open,但是对于这两个函数,Python脚本在进行命令行调用后会挂起,因为调用的是一个长时间运行的服务器程序(所以它永远不会“完成”)。我知道如果要使用其他Python代码实现这样的操作,可以使用类似celery的工具,但我认为应该有一种简单的方法,使它能够仅仅进行命令行调用而不被“卡住”,然后继续执行。我想知道我是否做错了什么...谢谢任何建议。
我当前正在这样进行调用:
os.system("command_to_start_server")

也尝试了以下方法:

response = os.popen("command_to_start_server")
3个回答

9
我不确定,但我认为使用subprocess模块的Popen比os.popen更加灵活。如果我没记错的话,它包括异步进程生成,这可能是你正在寻找的内容。 编辑:我已经有一段时间没有使用subprocess模块了,但如果我没有弄错的话,subprocess.Popen立即返回,只有当您尝试与进程通信(例如读取其输出)时,如果没有输出,您的程序才会阻塞等待输出。

谢谢,这听起来比我之前做的更好的解决方案... 当我通过最初从Django启动的对象进行cmd行调用时,会出现一些奇怪的“绑定”类型行为,我所做的调用是启动另一个测试服务器(在不同的端口上),但是它会以某种方式绑定到Django测试服务器上,导致Django测试服务器失败,即使我可以在cmd行手动启动它们两个。 - Rick

2

0

尝试:

os.system("command_to_start_server &>/dev/null &")

谢谢,虽然页面在 Django 中仍然显示“加载”,但是通过你所说的方法,它可以工作了,尽管它仍然表现出一些奇怪的行为(即使它正在显示最终输出)并且会无限期地显示“加载”... 但是按照你所说的做法,让它成功地跨过了它一直“挂起”的部分。 - Rick
现在它将整个输出重定向到/dev/null,因此页面上将不会显示任何内容。 - tamasd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接