经过许多不同的测试,搜索和尝试别人的不同方法,我现在有点迷失了,所以希望有人能帮助我......
我正在尝试生成子进程(在我的情况下调用外部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
答案 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。
再次感谢!