0

我的部分代码:

import subprocess
import logging
logging.basicConfig(filename='daily_backup_run.log', level=logging.DEBUG)

try:
  git_command = subprocess.Popen("git status", shell="true")
  git_status_output = git_command.stdout.readline()
except subprocess.CalledProcessError, e:
  git_status_output = e.output
logging.debug(' Output of git status: ' + git_status_output)
exit()

当我尝试运行它时,我的输出是:

[~/experiment_folder]# python git.py
Traceback (most recent call last):
  File "git.py", line 35, in ?
    except subprocess.CalledProcessError, e:
AttributeError: 'module' object has no attribute 'CalledProcessError'
fatal: Not a git repository (or any of the parent directories): .git

目前我并不关心 Python 错误,但我需要git 发送的所有输出进入daily_backup_run.log- 甚至是fatal: Not a repo错误。我如何确保这一点?

4

1 回答 1

3

子流程模块文档中:

stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE、现有文件描述符(正整数)、现有文件对象和无。PIPE 表示应该创建一个通往子级的新管道。

您可以按如下方式修改代码:

# working dir in which git [command] is called
cwd = '/path/to/git/repository' 

p = subprocess.Popen("git status", shell="true", cwd=cwd,
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outdata, errdata = p.communicate()

logging.debug('Output of git status: {}. Error data if any: {}'
              .format(outdata, errdata))
于 2012-10-12T10:04:37.347 回答