Python同步运行?一次运行一个可执行文件

时间:2014-11-21 18:07:18

标签: python executable os.system

尝试使用python来控制许多已编译的可执行文件,但遇到时间轴问题!我需要能够同时运行两个可执行文件,并且还能够等待'直到可执行文件在启动另一个之前完成。此外,其中一些需要超级用户。以下是我到目前为止的情况:

import os
sudoPassword = "PASS"
executable1 = "EXEC1"
executable2 = "EXEC2"
executable3 = "EXEC3"
filename = "~/Desktop/folder/"
commandA = filename+executable1
commandB = filename+executable2
commandC = filename+executable3
os.system('echo %s | sudo %s; %s' % (sudoPassword, commandA, commandB))
os.system('echo %s | sudo %s' % (sudoPassword, commandC))
print ('DONESIES')

假设os.system()在移动到下一行之前等待可执行文件完成,这应该同时运行EXEC1和EXEC2,并在完成后运行EXEC3 ... 但它并没有。实际上,它甚至印刷了“DONESIES”。在commandB甚至完成之前的shell中... 请帮忙!

2 个答案:

答案 0 :(得分:1)

您的脚本仍将按顺序执行所有3个命令。在shell脚本中,分号只是在一行上放置多个命令的一种方法。它没有做任何特殊的事情,它只是一个接一个地运行它们。

如果要从Python程序并行运行外部程序,请使用subprocess模块:https://docs.python.org/2/library/subprocess.html

答案 1 :(得分:1)

使用subprocess.Popen在后台运行多个命令。如果你只是想让程序的stdout / err进入屏幕(或者完全被抛弃),那么它非常直接。如果你想处理命令的输出......那就变得更复杂了。您可能会按命令启动一个线程。

但是这是符合你的例子的情况:

import os
import subprocess as subp

sudoPassword = "PASS"
executable1 = "EXEC1"
executable2 = "EXEC2"
executable3 = "EXEC3"
filename = os.path.expanduser("~/Desktop/folder/")
commandA = os.path.join(filename, executable1)
commandB = os.path.join(filename, executable2)
commandC = os.path.join(filename, executable3)

def sudo_cmd(cmd, password):
    p = subp.Popen(['sudo', '-S'] + cmd, stdin=subp.PIPE)
    p.stdin.write(password + '\n')
    p.stdin.close()
    return p

# run A and B in parallel
exec_A = sudo_cmd([commandA], sudoPassword)
exec_B = sudo_cmd([commandB], sudoPassword)

# wait for A before starting C
exec_A.wait()
exec_C = sudo_cmd([commandC], sudoPassword)

# wait for the stragglers
exec_B.wait()
exec_C.wait()

print ('DONESIES')