Python,并行运行命令行工具

标签 python shell command-line parallel-processing

我正在使用 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 并且您的进程将大量数据写入标准输出,您的程序将会死锁。确保将所有输出重定向到日志文件。

p1p2 是您可以用来监视进程的对象。 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/

相关文章:

python - Tensorflow.compat.v2.__internal__.tracking' 没有属性 'TrackableSaver' 错误

shell - 在后台运行 CakePHP Shell

linux - 将命令行参数传递给 bash 脚本命令

argc/argv 中的命令行解析

image-processing - 使用 ImageMagick 从 PSD 中提取图层,保留布局

windows - 使用具有空值的命令按三列对 csv 文件进行排序?

python - 将输入分成两部分。 python 3

python - 由于类结构,Tkinter Return 键绑定(bind)不起作用

python - 如何在 Mechanize 中设置与另一个字段具有重复名称的字段?

linux - 计算行数的shell脚本程序