Popen Подпроцесс Python - PullRequest
0 голосов
/ 27 июня 2018

Я использую Popen для сценария удаленного вызова

s = Popen(['ssh' , ssh_argument0 , ssh_argument1 , '/tmp/remote/dude_rc_admsvr.sh %s %s' %(DomainHome , ACTIVITY)]) 

stdout = s.communicate ()

стандартный вывод

Сценарий не завершает работу со статусом, указанным в сценарии оболочки, вместо этого он печатает только статус успеха или сбоя.

Я хочу выйти с кодами состояния согласно сценарию оболочки. вот скрипт оболочки

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 

Как вернуть код состояния?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Добавление нового ответа, поскольку вы изменили свой код с использования check_call на использование Popen и communicate.

Из документации subprocess.communicate :

Обратите внимание, что если вы хотите отправить данные на stdin процесса, вам необходимо создайте объект Popen с помощью stdin=PIPE. Точно так же, чтобы получить что-нибудь кроме None в кортеже результата, вы должны дать stdout=PIPE и / или stderr=PIPE тоже.

Другими словами, вам нужно добавить stdout=PIPE к вашему вызову в конструктор Popen, чтобы использовать 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
0 голосов
/ 28 июня 2018

Найдена проблема:

Оператор tail в сценарии оболочки содержал сеанс SSH, поэтому Попен не смог выйти из подоболочки. Добавление kill -9 ps -eaf |grep tail решило проблему.

0 голосов
/ 27 июня 2018

Из документации 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)
...