多个子流程打印到文件

时间:2016-05-31 17:33:35

标签: python subprocess

我在使用两个子进程时遇到问题(我会在修复后添加更多)以打印到文件。我从awk那里得到了这笔钱,现在我试图将它打印到一个文件中并且打印不正确。我使用的是Python 2.6,无法升级。我也在我的程序结束时关闭我的文件,所以这不是问题。 编辑: 此代码的目的是循环文件并计算特定字符串出现的次数。将它们放在文件中,然后将文件总计在最终输出文件中。

def serv2Process(HOST = "testServer.com"):
        encInTotal1 = 0
        signInTotal1 = 0
        p = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
            shell = False,
            stdout = subprocess.PIPE,
            close_fds = True)
        for line in p.stdout:
            if 'String to search'.lower() in line.lower():
                totalCount1 = totalCount1 +1
            if 'String 2 to search'.lower() in line.lower():
                totalCount2 = totalCount2 +1
        file1.write("%s\n" %totalCount1)
        file2.write("%s\n" %totalCount2)

        sys.stdout.flush()

    p1 =threading.Thread(target = serv1Process, args=(HOST1,), name = 'serv1Process')
    p2=threading.Thread(target = serv2Process, args= (HOST2,), name = 'serv2Process')
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    with open("SomeScriptName.%s" % strDateForm, 'w+')as search_file:
        search_file.write("Header: ")
        sys.stdout.flush()
        proc = subprocess.Popen(['awk', '{sum+=$1} END {print sum}',"file1.%s" %strDateForm], shell=False, stdout=search_file,close_fds = True)
        proc.wait()

        search_file.write("\n")
        search_file.write("Header2: ")
        search_file.flush()
        proc2 = subprocess.Popen(['awk', '{s+=$1} END {print s}',"file2.%s" %strDateForm], shell=False, stdout=search_file,close_fds = True)
        proc2.wait()
    file1.close()
    file2.close()

1 个答案:

答案 0 :(得分:0)

您需要确保在启动过程的同时不写入文件。为此,请确保在开始进程之前刷新文件,并在再次写入之前等待进程完成。

with open("SomeFileName.%s" % strDateForm, 'w+') as search_file:

    search_file.write("header: ")
    search_file.flush()

    proc = subprocess.Popen(['awk', '{sum+=$1} END {print sum}',"AnotherFileName" ], shell=False, stdout=search_file,stderr = subprocess.PIPE,close_fds = True)
    proc.wait()

    search_file.write("Header 2: ")
    search_file.flush()

    proc2 = subprocess.Popen(['awk', '{s+=$1} END {print s}',"AThirdFileName"], shell=False, stdout=search_file,stderr = subprocess.PIPE,close_fds = True)
    proc2.wait()

此外,您将stderr重定向到管道,但您从未读过它。如果子进程在stderr上产生足够的输出以填充管道缓冲区,它将阻塞。如果您对stderr不感兴趣,请不要重定向它以使其转到终端或将其重定向到/dev/null

您尝试刷新sys.stdout,但这不会影响与此代码相关的任何内容。

编辑:看到更新的代码后,请注意以下几点:

  • 假设打开的文件file1file2awk子进程尝试读取的文件:确保在启动任何进程之前刷新或关闭它们
  • 您多次致电sys.stdout.flush(),但这样做毫无意义。你并没有真正写入sys.stdoutd,所以刷新它并没有真正做任何事情。请改为file1file2search_file
  • 如果这不是使用subprocess模块的代码,您应该考虑直接使用python来汇总文件中的数字,而不是将其炮轰为awk。