В Python 3 subprocess.check_output
возвращает bytes
объекты, а не str
строки:
По умолчанию эта функция будет возвращать данные в виде закодированных байтов. Фактическое кодирование выходных данных может зависеть от вызываемой команды, поэтому часто требуется, чтобы декодирование в текст обрабатывалось на уровне приложения.
Однако, если вы уверены, что вы будете получать данные в кодировке вашей платформы по умолчанию (достаточно безопасно, здесь), вы можете установить параметр universal_newlines
в True
:
universal_newlines
Если это True
, эти файловые объекты будут открываться как текстовые потоки в режиме universal newlines с использованием кодировки, возвращаемой locale.getpreferredencoding(False)
.
Это также будет обрабатывать распространенные пробельные раздражения, такие как концевые символы (как следует из названия).
Вот функция, которая возвращает вывод Git как строку, используя universal_newlines
:
def git_hash(commit_name='HEAD'):
git_command = 'C:/Program Files/Git/bin/git'
hash_string = subprocess.check_output(
[git_command, 'rev-parse', commit_name],
universal_newlines=True
)
return hash_string
А вот пример написания этой строки в файл:
fname = 'C:/temp/git_hash.txt'
with open(fname, 'w') as f:
f.write(git_hash())
Это использует синтаксис with open(...):
что было предложено в комментариях, а также в The Python Tutorial. Он (к сожалению) хорошо скрыт, появляясь в конце раздела 7.2.1. Methods of File Objects.
Лучше использовать 'с открытым (...) как' здесь. Обратите внимание, что в Python 2.7 строки * являются * байтовыми строками, поэтому проблема возникает только в Python 3.x.(И это не имеет ничего общего с самим Git: все, что вы запускаете с 'subprocess', ведет себя таким образом, поскольку подпроцессы производят байт-потоки.) – torek