让我们说我在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;即使它真的完成了。
答案 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
对于同时运行代码的更一般方法,您可以在另一个thread或process中运行该方法。这是示例代码:
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>