如何在Python中检查shell命令是否结束

时间:2014-06-28 20:14:29

标签: python bash shell

让我们说我在python中有这个简单的行:

os.system("sudo apt-get update")

当然,apt-get需要一些时间才能完成,如果命令已经完成或者还没有完成,我该如何检查python?

编辑:这是Popen的代码:

     os.environ['packagename'] = entry.get_text()
     process = Popen(['dpkg-repack', '$packagename'])
     if process.poll() is None:
       print "It still working.."
     else:
       print "It finished"

现在的问题是,它从不打印"它已经完成了#34;即使它真的完成了。

3 个答案:

答案 0 :(得分:8)

正如文件所述:

  

这是通过调用标准C函数系统()来实现的   具有相同的局限性

system的C调用只是运行程序直到它退出。调用os.system会阻塞你的python代码,直到bash命令完成,因此当os.system返回时你就会知道它已经完成了。如果你想在等待电话结束时做其他事情,有几种可能性。首选方法是使用subprocessing模块。

from subprocess import Popen
...
# Runs the command in another process. Doesn't block
process = Popen(['ls', '-l'])
# Later
# Returns the return code of the command. None if it hasn't finished
if process.poll() is None: 
    # Still running
else:
    # Has finished

查看上面的链接,了解使用Popen

可以执行的更多操作

对于同时运行代码的更一般方法,您可以在另一个threadprocess中运行该方法。这是示例代码:

from threading import Thread
...
thread = Thread(group=None, target=lambda:os.system("ls -l"))
thread.run()
# Later
if thread.is_alive():
   # Still running
else:
   # Has finished

另一种选择是使用concurrent.futures模块。

答案 1 :(得分:1)

os.system实际上会等待命令完成并返回退出状态(格式相关的格式)。

答案 2 :(得分:0)

os.system正在阻止;它调用命令等待它的完成,并返回它的返回码。

所以,一旦os.system返回,它就会完成。

如果您的代码不起作用,我认为这可能是由sudo的一个怪癖引起的,它拒绝在某些环境中给予权利(我不知道细节)。< / p>