使用popen communication()或wait()挂起/延迟子进程(Python 2.7.9)



经过许多不同的测试,搜索和尝试其他人的不同方法,我目前有点迷失在这里,所以希望任何人都能帮助我…

我正在尝试生成子流程(在我的情况下调用外部powershell脚本),我想获得stdout和返回代码。过去,我的代码已经在win32下使用旧版本的Python 2.7运行,但现在在我的新开发机器(64Bit/Win7)上,我无法完全运行它…:-/(我想我的旧机器是32位的,如果这可能是个问题的话)

奇怪的是:在我的Eclipse环境(4.4.1)中执行代码基本上可以工作,但它只是"挂起"在stdout行之后。在调用proc.communicate()的点上,输出在"DEBUG1"之前"延迟"(proc.wait()也是如此)。(我没有看到"DEBUG1"或"DEBUG2",但我看到了"DEBUG0"和logger.info(stdout)行)

要对此进行更详细的解释:如果我只是等待一段时间,那么在"DEBUG0"和stdout行之后什么都不会发生但是-如果我按"enter",那么输出将继续,我看到"DEBUG1",然后大约一秒钟后"突然"子流程完成,所有输出都会给出("DEBUG2"),一切都很好。。。

我只是不明白当我不在那里按Enter键时如何自动解决这个问题…:-/

正如我所说,该代码在过去已经在我的旧开发环境中工作,当然没有点击"回车";)我想冲洗可能会有所帮助,但正如你所看到的,这并没有奏效。

有什么想法吗?提示?非常感谢!

以下是决定性的代码片段:

    try:
        proc = subprocess.Popen([powershell_bin,
                               '-ExecutionPolicy',
                               'Unrestricted',
                               '-NonInteractive',
                               '-NoProfile',
                               '-Command',
                               settings['ext_ps_commands'][self.cmd],
                               usr,
                               grp],
                               stdout=subprocess.PIPE)
    except Exception as e:
        warnmsg = "..."
        logger.warn(warnmsg)
        return -1
    print "DEBUG0"
    sys.stdout.flush()
    while True:
        line = proc.stdout.readline()
        if line != '':
            stdout = "  stdout:", line.rstrip()
            logger.info(stdout)
        else:
            break
    print "DEBUG1"
    sys.stdout.flush()
    exitcode = proc.wait()
    # stdout, stderr = proc.communicate()
    # exitcode = proc.returncode
    print "DEBUG2"
    sys.stdout.flush()
    return exitcode

@J.F.Sebastian:非常感谢您的想法和建议(包括改进的异常处理),实际上您带来了解决方案:这是一个Eclipse/PyDev问题。在原始cmd.exe控制台中,代码运行良好!:)(带有.communicate().wait()的两个版本)

这是我第一次遇到控制台和Eclipse之间的行为差异,所以我没有想到这一点。我的Eclipse中似乎有一些错误或配置问题。它是Eclipse SDK Luna SR1(4.4.1)和PyDev 3.9.1,我可能应该测试Eclipse 4.4.2和PyDev3.9.2。

再次感谢!

最新更新