在Python中将git提交哈希值输出到文件

3

我正在尝试通过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
最好在这里使用with open(...) as。请注意,在Python 2.7中,字符串字节字符串,因此问题只会在Python 3.x中出现。(这与Git本身无关;使用subprocess运行的任何内容都会产生字节流。) - torek
2个回答

3
那只是一个字节字符串。在写入之前,您只需要将其进行解码: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())

@KcFnMi 当然可以,但它变得非常长了,我决定把它分开,使它对眼睛更容易些。 :-) - Dimitris Fasarakis Hilliard

0
在Python 3中,subprocess.check_output 返回的是bytes对象,而不是str字符串:

默认情况下,此函数将返回编码后的字节数据。输出数据的实际编码可能取决于所调用的命令,因此文本解码通常需要在应用程序级别处理。

然而,如果您确信将获取平台默认编码的数据(在这里足够安全),则可以将参数universal_newlines设置为True
如果universal_newlinesTrue,这些文件对象将作为文本流以通用换行符模式打开,使用locale.getpreferredencoding(False)返回的编码。

这也会处理常见的空格烦恼,如行尾字符(正如名称所示)。

这是一个函数,它使用universal_newlines将Git的输出作为字符串返回:

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(...):语法,也在Python教程中提到。它(不幸地)被很好地隐藏起来,出现在第7.2.1. 文件对象的方法节的末尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接