这是运行任意命令返回其stdout数据的Python代码,或者在非零退出代码上引发异常:
proc = subprocess.Popen(
cmd,
stderr=subprocess.STDOUT, # Merge stdout and stderr
stdout=subprocess.PIPE,
shell=True)
Run Code Online (Sandbox Code Playgroud)
communicate 用于等待进程退出:
stdoutdata, stderrdata = proc.communicate()
Run Code Online (Sandbox Code Playgroud)
该subprocess模块不支持超时 - 能够终止运行超过X秒的进程 - 因此,communicate可能需要永久运行.
在旨在在Windows和Linux上运行的Python程序中实现超时的最简单方法是什么?
我正在使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用时杀死:
p.terminate()
Run Code Online (Sandbox Code Playgroud)
要么
p.kill()
Run Code Online (Sandbox Code Playgroud)
该命令在后台继续运行,所以我想知道如何实际终止该进程.
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
它在发出时会成功终止p.terminate().
我的python脚本(python 3.4.3)通过子进程调用bash脚本:
import subprocess as sp
res = sp.check_output("bashscript", shell=True)
Run Code Online (Sandbox Code Playgroud)
该bashscript包含以下行:
ssh -MNf somehost
Run Code Online (Sandbox Code Playgroud)
这将打开与某个远程主机的共享主连接,以允许一些后续操作.
执行python脚本时,它将提示该ssh行的密码,但在输入密码后它会阻塞,并且永远不会返回.当我按ctrl-C终止脚本时,我看到连接已正确建立(因此ssh行已成功执行).
使用时,我没有这个阻塞问题check_call,而不是check_output,但check_call不检索标准输出.我想了解究竟是什么导致阻塞行为check_output,可能与某些微妙的相关ssh -MNf.