尝试使用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中... 请帮忙!
答案 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')