我正在使用 Python 作为脚本语言来进行一些数据处理并调用命令行工具进行数字运算。我希望并行运行命令行工具,因为它们彼此独立。当一个命令行工具完成后,我可以从输出文件中收集它的结果。所以我还需要一些同步机制来通知我的主 Python 程序一个任务已完成,以便可以将结果解析到我的主程序中。
目前,我使用 os.system()
,它适用于单线程,但不能并行化。
谢谢!
最佳答案
如果您想将命令行工具作为单独的进程运行,只需使用 os.system
(或更好:subprocess
模块)异步启动它们。在 Unix/linux/macos 上:
subprocess.call("command -flags arguments &", shell=True)
在 Windows 上:
subprocess.call("start command -flags arguments", shell=True)
至于知道命令何时完成:在 unix 下,您可以设置 wait
等,但如果您正在编写命令行脚本,我只会让他们写一条消息到一个文件中,并从调用 python 脚本中监视该文件。
@James Youngman 针对您的第二个问题提出了一个解决方案:同步。如果你想从 python 控制你的进程,你可以使用 Popen 异步启动它们。
p1 = subprocess.Popen("command1 -flags arguments")
p2 = subprocess.Popen("command2 -flags arguments")
请注意,如果您使用 Popen 并且您的进程将大量数据写入标准输出,您的程序将会死锁。确保将所有输出重定向到日志文件。
p1
和 p2
是您可以用来监视进程的对象。 p1.poll()
不会阻塞,但如果进程仍在运行则返回 None。完成后它将返回退出状态,因此您可以检查它是否为零。
while True:
time.sleep(60)
for proc in [p1, p2]:
status = proc.poll()
if status == None:
continue
elif status == 0:
# harvest the answers
else:
print "command1 failed with status", status
上面只是一个模型:如写的那样,它永远不会退出,它会不断地“收割”完成过程的结果。但我相信你明白了。
关于Python,并行运行命令行工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554544/