我正在使用一个git
命令
git log --format=%H 3c2232a5583711aa5f37d0f21014934f67913202
这里的长字符串是提交ID。此命令提供分支的先前提交ID的列表。输出就像
3c2232a5583711aa5f37d0f21014934f67913202
9i45e2a5583711aa5f37d0f21014934f679132de
我试图在python中发出相同的命令,并尝试将输出存储在以下字符串中,
import subprocess
result = subprocess.run(
[
"cd",
"/Users/XYZ/Desktop/gitrepo",
"git",
"log",
"3c2232a5583711aa5f37d0f21014934f67913202",
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print(result.stdout.decode("utf-8"), type(result.stdout.decode("utf-8")))
但是打印输出为空!我尝试将subprocess.run
与["-ls", "-l"]
一起使用,效果很好。 git命令在命令行上有效,但是我无法将其捕获为字符串。当我单独打印结果时,
CompletedProcess(args=['cd', '/Users/XYZ/Desktop/gitrepo', 'git', 'log', '3c2232a5583711aa5f37d0f21014934f67913202'], returncode=0, stdout=b'')
如何将git命令的输出保存为字符串?我在一行中发出两个命令。我应该分别发布命令吗?如果可以的话,如何(a)导航到git文件夹并(b)在其中发出git命令?
答案 0 :(得分:1)
您的代码运行cd "/Users/XYZ/Desktop/gitrepo" "git" "log" "3c2232a5583711aa5f37d0f21014934f67913202"
,这可能不是您想要的。
最好的方法不是将更改工作目录解释为单独的命令,而是将其解释为运行git命令的环境设置的一部分。 The subprocess module has the keyword argument cwd
for that.
如果cwd不为None,则函数将工作目录更改为cwd 在处死孩子之前。特别是,该函数寻找 相对于cwd的可执行文件(或args中的第一项) 可执行路径是相对路径。
这仅针对Popen构造函数进行了说明,但是subprocess.run
documentation具有以下段落:
上面显示的参数仅仅是最常见的参数,描述如下 下面的“常用参数”中(因此仅使用关键字 缩写签名中的符号)。全功能签名是 与Popen构造函数基本相同-除了 超时,输入和检查,此函数的所有参数均为 通过该接口。
所以您可以这样重写代码:
import subprocess
result = subprocess.run(
[
"git",
"log",
"3c2232a5583711aa5f37d0f21014934f67913202",
],
cwd="/Users/XYZ/Desktop/gitrepo"
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print(result.stdout.decode("utf-8"), type(result.stdout.decode("utf-8")))