Я не вижу что-то вроде
stdout_data, stderr_data = p1.communicate()
в вашем коде
Popen.communicate (вход = нет)
Взаимодействие с процессом: отправка данных на стандартный ввод. Читайте данные из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательный входной аргумент должен быть строкой, которая должна быть отправлена дочернему процессу, или None, если никакие данные не должны быть отправлены дочернему процессу.
connect () возвращает кортеж (stdoutdata, stderrdata).
Обратите внимание, что если вы хотите отправить данные в стандартный процесс, вам нужно создать объект Popen с stdin = PIPE. Точно так же, чтобы получить что-либо кроме None в кортеже результата, вам нужно также указать stdout = PIPE и / или stderr = PIPE.
Примечание. Считываемые данные буферизируются в памяти, поэтому не используйте этот метод, если размер данных большой или неограниченный.
См. docs.python.org
Функция, которую я держу в своем служебном поясе, чтобы обернуть вызов внешней программы с использованием подпроцесса, выглядит так (измените в соответствии с вашими потребностями):
def __run(self, cmd):
"""wrapper, makes it easy to call an external program.
return the result as a newline-separated list
"""
args = shlex.split(cmd)
try:
p = subprocess.Popen(args, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
retdata = p.communicate()[0]
p.wait()
except OSError, e:
print >>sys.stderr, "Execution failed:", e
return (p.returncode, retdata.split('\n'))
Просто поместите вашу команду так, как вы написали бы ее в строке cmd в переменной, вызовите функцию, например ::1010 *
cmd = r'git branch -r'
data = self.__run(cmd)