繁体   English   中英

Popen子进程Python

[英]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 

如何获得状态码返回?

subprocess.check_call的文档中

如果返回码为零,则返回,否则引发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使用Popencommunicate

subprocess.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM