【发布时间】:2015-04-16 11:04:24
【问题描述】:
我不知道如何关闭通过Popen 启动的bash shell。我在 Windows 上,并试图自动化一些 ssh 的东西。通过 git 附带的 bash shell 更容易做到这一点,因此我通过 Popen 以下列方式调用它:
p = Popen('"my/windows/path/to/bash.exe" | git clone or other commands')
p.wait()
问题是在 bash 运行我通过管道输入的命令后,它并没有关闭。它保持打开状态,导致我的wait 无限期阻塞。
我已经尝试在最后串一个“退出”命令,但它不起作用。
p = Popen('"my/windows/path/to/bash.exe" | git clone or other commands && exit')
p.wait()
但仍然会无限阻塞等待。完成任务后,它只是坐在 bash 提示符下什么都不做。如何强制关闭?
【问题讨论】:
-
这里的
|字符是怎么回事?这不是您将命令传递给 bash 的方式。 -
另外,你为什么要调用 bash,而不是 直接 从 Python 调用你的 git 命令?直接路由使信号处理更容易——这意味着您可以轻松检查或终止 git 命令本身的状态,而不是仅在 bash shell 上有一个句柄而无法分辨 git(或它下面的其他子进程)是什么做。
-
@CharlesDuffy 这是你在 bash 中管道命令的方式
-
Popen(['/path/to/bash.exe', '-c', 'command; command; command']
-
是的,这就是您在 bash 中设置管道的方式,但是您不会通过将 shell 的输出通过管道传输到该命令来在 shell 中运行命令。
bash | git clone获取bash的输出并将其作为git clone的输入发送,但git clone不会从标准输入中读取,bash 只会在该用法中等待输入,这就是您得到你在这里抱怨的行为('wait()' 永远不会退出)。
标签: python windows bash subprocess popen