2016-11-26 4 views
1

Я пытаюсь записать в файл хеш-код с помощью Python. Так что я сделал:Pipe git commit hash для файла в Python

f = open('git.txt', 'w') 
f.write(str(subprocess.check_output(['C:/Program Files/Git/bin/git', 'rev-parse', 'HEAD']))) 
f.close() 

Но это написал следующее в файл:

b'714548ca074bd6e7c40973375e32413e63a67027\n' 

Я хотел бы просто:

714548ca074bd6e7c40973375e32413e63a67027 

Как я могу это сделать?

+1

Лучше использовать 'с открытым (...) как' здесь. Обратите внимание, что в Python 2.7 строки * являются * байтовыми строками, поэтому проблема возникает только в Python 3.x.(И это не имеет ничего общего с самим Git: все, что вы запускаете с 'subprocess', ведет себя таким образом, поскольку подпроцессы производят байт-потоки.) – torek

ответ

2

Это всего лишь byte строка. Все, что вам нужно сделать, это decode его перед записью:

r = subprocess.check_output(['C:/Program Files/Git/bin/git', 'rev-parse', 'HEAD']) 
f.write(r.strip().decode()) 

r.strip() было призвано снять заднюю '\n', в качестве альтернативы вы можете сделать r[:-1].decode(), если вы предпочитаете.

Кроме того, как отмечает @torek, лучше открыть файлы, используя оператор with, который автоматически закрывает его для вас.

Итак:

# add .strip().decode() at the end if you want a single line statement. 
res = subprocess.check_output(['C:/Program Files/Git/bin/git', 'rev-parse', 'HEAD']) 
with open('git.txt', 'w') as f: 
    f.write(res.strip().decode()) 
+0

Можете ли вы сделать это в одной строке кода? – KcFnMi

+0

@KcFnMi уверен, но это действительно очень долго, я решил затормозить, чтобы сделать его немного легче на глазах. :-) –

0

В 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.