如何将subprocess.run的输出保存为字符串?

时间:2019-07-04 19:21:16

标签: python python-3.x

我正在使用一个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命令?

1 个答案:

答案 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")))