[英]Popen Subprocess Python
我正在使用Popen进行远程调用脚本
s = Popen(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)])
stdout = s.communicate()
打印标准输出
该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。
我想根据外壳脚本退出状态代码。 这是shell脚本
tail -Fn0 ${ADM_DOMAIN_LOG} | \
while read LOG_LINE;
do
echo ${LOG_LINE} | grep -q "${PASS_MSG}"
if [ $? = 0 ]
then
echo "${STATUS_SUCCESS}"
exit 0
elif echo ${LOG_LINE} | grep -q "${FAIL_MSG}"
then
echo "${STATUS_FAILURE}"
exit 1
elif echo ${LOG_LINE} | grep -q "${FAIL_MSG2}"
then
echo "${STATUS_FAILURE}"
exit 1
fi
done
exit
如何获得状态码返回?
如果返回码为零,则返回,否则引发
CalledProcessError
。 该CalledProcessError
对象将在返回代码returncode
属性。
因此,要获取状态码,您需要捕获异常并检索returncode
属性。
try:
check_call(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)])
except subprocess.CalledProcessError as e:
print('status code = %s' % e.returncode)
添加,因为你的问题改变了你的代码使用一个新的答案check_call
使用Popen
和communicate
。
请注意,如果要将数据发送到进程的
stdin
,则需要使用stdin=PIPE
创建Popen
对象。 同样,要在结果元组中获得除None
以外的任何内容,您还需要提供stdout=PIPE
和/或stderr=PIPE
。
换句话说,您需要在对Popen
的构造函数的调用中添加stdout=PIPE
才能使用communicate
。
s = Popen(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)], stdout=PIPE)
stdout = s.communicate()
returncode = s.returncode
发现的问题:
shell脚本中的tail语句持有SSH会话,这就是为什么Popen无法退出子shell的原因,添加kill -9 ps -eaf |grep tail
解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.