经过许多不同的测试,搜索和尝试其他人的不同方法,我目前有点迷失在这里,所以希望任何人都能帮助我…
我正在尝试生成子流程(在我的情况下调用外部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。
再次感谢!