подпроцесс python для захвата стандартного ввода и стандартного вывода в переменную - PullRequest
0 голосов
/ 19 сентября 2018

Обратите внимание: у меня есть дополнительный вопрос со ссылкой на обновленный код здесь ..

Ниже приведен только один кусочек кода, который я с нетерпением жду, чтобы урезать и понятькак сделать это лучше ..

 import subprocess
 cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dest_dir)
 cmd_content = cmd
 p = subprocess.Popen(cmd,shell=True)
 p.wait()
 print("DONE")
 return cmd_content + " Rsync process completed."

Что я с нетерпением жду, чтобы захватить stdout & stderr из моего сценария, чтобы его можно было перехватить в переменную, чтобы я мог использовать и отправить его каквложение электронной почты.

Итак, рефакторинг вышеупомянутой части здесь я импортирую Popen и PIPE явно, однако, я использовал p.communicate(), поскольку я вижу, Popen.communicate() взаимодействует с процессом иОтправляет данные в stdin, читает данные из stdout и stderr, пока не будет достигнут конец файла, он также ожидает завершения процесса.

 from subprocess import Popen, PIPE
 cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dest_dir)
 cmd_content = cmd
 p = Popen(cmd,stdout=PIPE,shell=True)
 p.communicate()
 print("DONE")
 return cmd_content + " Rsync process completed."

Я вижу Python 2.7 и далее, он также поддерживает subprocess.check_output() Таким образом, мы можем избежать непосредственного использования объекта Popen и использовать функцию subprocess.check_output () для хранения вывода команды в строке следующим образом, но я сомневаюсь, что в моем случае это займет, так как я использую переменную cmd для передачи в видеshell=True.

>>> from subprocess import check_output
>>> out = check_output(cmd)

Iпросмотрел примеры подпроцесса и вопросы по сети и SO, но не получил необходимой информации.

...