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

时间:2015-03-25 17:02:08

标签: eclipse windows python-2.7 subprocess pywin32

经过许多不同的测试,搜索和尝试别人的不同方法,我现在有点迷失了,所以希望有人能帮助我......

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

奇怪的是:在我的Eclipse环境(4.4.1)中执行代码基本上有效,但它只是"挂起"在stdout-lines之后。输出是"延迟"之前' DEBUG1'在调用proc.communicate()的位置(与proc.wait()相同)。 (我没有看到' DEBUG1' DEBUG2'但我看到了'DEBUG0'以及logger.info(stdout)

更详细地解释这个: 如果我等待一段时间后,“DEBUG0' DEBUG0'和标准线。 但是 - 如果我按“输入”,则输出恢复,我看到“DEBUG1'然后大约一秒钟后突然间#39;子流程完成后,所有输出都给出了(' 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

1 个答案:

答案 0 :(得分:1)

@ J.F。塞巴斯蒂安: 非常感谢您的想法和建议(包括改进的异常处理),实际上您带来了解决方案:这是一个Eclipse / PyDev问题。 在原始cmd.exe控制台中,代码工作得很好! :) (包含.communicate().wait()

的两个版本

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

再次感谢!