Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子进程检查调用与检查输出_Python_Bash_Ssh_Subprocess - Fatal编程技术网

Python子进程检查调用与检查输出

Python子进程检查调用与检查输出,python,bash,ssh,subprocess,Python,Bash,Ssh,Subprocess,我的python脚本(python 3.4.3)通过子流程调用bash脚本: import subprocess as sp res = sp.check_output("bashscript", shell=True) bashscript包含以下行: ssh -MNf somehost 这将打开到某个远程主机的共享主连接,以允许后续操作 当执行python脚本时,它将提示输入ssh行的密码,但在输入密码后它将阻塞,并且永远不会返回。当我按住ctrl-C键终止脚本时,我看到连接已正确建立(

我的python脚本(python 3.4.3)通过子流程调用bash脚本:

import subprocess as sp
res = sp.check_output("bashscript", shell=True)
bashscript包含以下行:

ssh -MNf somehost
这将打开到某个远程主机的共享主连接,以允许后续操作

当执行python脚本时,它将提示输入
ssh
行的密码,但在输入密码后它将阻塞,并且永远不会返回。当我按住ctrl-C键终止脚本时,我看到连接已正确建立(因此
ssh
line已成功执行)

当使用
check\u call
而不是
check\u output
时,我没有这个阻塞问题,但是
check\u call
不会检索标准输出。我想了解到底是什么导致了
check\u output
的阻塞行为,这可能与
ssh-MNf
check\u call()
/bin/sh
进程退出而不等待子进程时返回有关(假设
shell=True

check_output()
等待所有输出被读取。如果
ssh
继承管道,则
check_output()
将等待它退出(直到它关闭继承的管道末端)

检查调用()
代码示例:

#!/usr/bin/env python
import subprocess
import sys
import time

start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' &"
subprocess.check_call(cmd, shell=True)
assert (time.time() - start) < 1
然后等待继承管道的后台python进程退出

检查\u output()
调用
Popen().communicate()
,以获取输出
.communicate()
在内部调用
.wait()
,即
检查输出()
还等待shell退出,并
检查输出()
等待EOF

如果孙辈没有继承管道,则
check\u output()
不会等待它:

start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) < 1
start=time.time()
cmd=sys.executable+“-c”导入时间;time.sleep(2)”>/dev/null&”
子进程检查输出(cmd,shell=True)
断言(time.time()-start)<1
孙子的输出被重定向到
/dev/null
,即它不继承父管道,因此
检查输出()
可能会在不等待的情况下退出


注意:
&
在最后,它将孙子python进程置于后台。默认情况下,在
shell=True
启动
cmd.exe
的Windows上,它不起作用。

太好了,谢谢您@jfs提供的详细解释
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) < 1