Обратите внимание: у меня есть дополнительный вопрос со ссылкой на обновленный код здесь ..
Ниже приведен только один кусочек кода, который я с нетерпением жду, чтобы урезать и понятькак сделать это лучше ..
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, но не получил необходимой информации.