gpt4 book ai didi

Python Popen + 通信只返回标准输出的第一行

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:42 24 4
gpt4 key购买 nike

我正在尝试使用我的命令行 git 客户端和 Python 的 I/O 重定向,以便在许多 git 存储库上自动执行一些常见操作。
(是的,这是 hack-ish。我可能会回去使用 Python 库来做这件事,但现在它似乎工作正常 :))

我希望能够捕获调用 git 的输出。 stash 输出会更好看,捕获它会让我记录它,以防它有用。

我的问题是,当我运行“git clone”命令时,我无法获得超过第一行的输出 .奇怪的是,带有 'git status' 的相同代码似乎工作得很好。

我在 Windows 7 上运行 Python 2.7,我正在使用 cmd.exe 命令解释器。

我的侦探到目前为止:

  • 当我用“git clone”调用 subprocess.call() 时它运行良好,我
    查看控制台上的输出(确认 git 正在生成
    输出,即使我没有捕获它)。这段代码:
    dir = "E:\\Work\\etc\\etc"
    os.chdir(dir)
    git_cmd = "git clone git@192.168.56.101:Mike_VonP/bit142_assign_2.git"

    #print "SUBPROCESS.CALL" + "="*20
    #ret = subprocess.call(git_cmd.split(), shell=True)

    将在控制台上产生此输出:
    SUBPROCESS.CALL====================
    Cloning into 'bit142_assign_2'...
    remote: Counting objects: 9, done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 9 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (9/9), done.
    Checking connectivity... done.
  • 如果我直接用 POpen 做同样的事情,我会看到相同的输出
    控制台(也没有被捕获)。这段代码:
    # (the dir = , os.chdir, and git_cmd= lines are still executed here)
    print "SUBPROCESS.POPEN" + "="*20
    p=subprocess.Popen(git_cmd.split(), shell=True)
    p.wait()

    将产生这个(实际上相同的)输出:
    SUBPROCESS.POPEN====================
    Cloning into 'bit142_assign_2'...
    remote: Counting objects: 9, done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 9 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (9/9), done.
    Checking connectivity... done.

    (显然我要在两次运行之间删除克隆的 repo,否则我会
    收到“一切都是最新的”消息)
  • 如果我使用communication() 方法,我期望得到一个字符串
    包含我在上面看到的所有输出。相反我只
    见行
    Cloning into 'bit142_assign_2'... .
    这段代码:
    print "SUBPROCESS.POPEN, COMMUNICATE" + "="*20
    p=subprocess.Popen(git_cmd.split(), shell=True,\
    bufsize = 1,\
    stderr=subprocess.PIPE,\
    stdout=subprocess.PIPE)
    tuple = p.communicate()
    p.wait()
    print "StdOut:\n" + tuple[0]
    print "StdErr:\n" + tuple[1]

    将产生这个输出:
    SUBPROCESS.POPEN, COMMUNICATE====================
    StdOut:

    StdErr:
    Cloning into 'bit142_assign_2'...

    一方面,我重定向了输出(正如您从事实中看到的那样)
    它不在输出中)但我也只捕获第一行。

  • 我尝试了很多东西(调用 check_output 而不是 popen,使用带有 subprocess.call 的管道,使用带有 subprocess.popen 的管道,以及我可能忘记的其他东西)但没有任何效果 - 我只捕获第一行输出。

    有趣的是, 完全相同的代码与 'git status' 一起正常工作 .一旦 repo 被克隆,调用 git status 会产生三行输出(统称为“一切都是最新的”),第三个示例(POpen+communicate 代码)确实捕获了所有三行输出。

    如果有人对我做错了什么有任何想法,或者对我可以尝试以更好地诊断这个问题的任何想法有任何想法,我将不胜感激。

    最佳答案

    尝试添加 --progress git 命令的选项。这会强制 git 将进度状态发送到 stderr,即使 git 进程未连接到终端 - 通过 subprocess 运行 git 时就是这种情况。职能。

    git_cmd = "git clone --progress git@192.168.56.101:Mike_VonP/bit142_assign_2.git"

    print "SUBPROCESS.POPEN, COMMUNICATE" + "="*20
    p = subprocess.Popen(git_cmd.split(), stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    tuple = p.communicate()
    p.wait()
    print "StdOut:\n" + tuple[0]
    print "StdErr:\n" + tuple[1]

    注意我无法在 Windows 上对此进行测试,但它在 Linux 上有效。

    此外,应该没有必要指定 shell=True这可能是一个安全问题,所以最好避免。

    关于Python Popen + 通信只返回标准输出的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564455/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com