2014-06-28 41 views
2

比方说,我在蟒蛇这个简单的一行:如何检查是否一个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" 

现在的问题是,它永远不会打印“它完成”,甚至当它真正完成。

+0

你为什么要检查? –

+0

@PadraicCunningham我想在第一个命令(dpkg-repack)结束时运行另一个命令,问题就像我在另一个评论中所说的那样,它并没有发出完成的信号,这就是为什么我一直在寻找另一种方式知道它是否完成。 – Madno

+0

你的下一个命令没有运行吗?发布您试图运行的代码 –

回答

7

由于文档指出它:

这是通过调用标准C函数system()来实现,并且 具有相同的限制

的C调用system只需运行该程序直到它退出。调用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模块。

+2

我很确定'subprocess'模块是在这种情况下走的路。 – utdemir

+1

忘了它,编辑即将到来。谢谢 –

+0

谢谢,我试过Popen的方式,但问题是我正在执行dpkg-repack命令,并且看起来像它完成打包.deb文件时,它滞后或某事,并且它不发送它具有的信号完成后,即使使用Popen,代码也会被阻止。 编辑:我试过apt-get,它有同样的问题(它不发送它已完成的信号)。 – Madno

0

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

因此,它会在os.system返回时完成。

如果你的代码不工作,我认为这可能是由sudo的怪癖之一引起的,它拒绝给予某些环境的权利(我不知道细节)。

0

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

相关问题