Python subprocess.Popen : 运行 多个命令 shell=True,但它似乎并没有等待所有命令完成

Python subprocess.Popen : Running multiple commands with shell=True, but it doesn't seem to be waiting for all commands to complete

我正在尝试使用 subprocess.Popen 到 运行 检查 Kafka 消费者组并记录他们的状态,但它似乎并没有等待 [=30] 的所有命令=].它没有给我任何标准输出,但它也 return 退出代码为 0。

prompt = ["cd", "~/path/to/kafka_2.11-2.1.0;", "pwd;", "./bin/kafka-consumer-groups.sh", 
          "--bootstrap-server", "localhost:9092", "--describe", "--group", "groupname"]

response = subprocess.run(prompt, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
                          shell=True, check=True)
print(response)

打印:

CompletedProcess(args=['cd', '~/path/to/kafka_2.11-2.1.0;', 'pwd;', './bin/kafka-consumer-groups.sh', '--bootstrap-server', 'localhost:9092', '--describe', '--group', 'groupname'], returncode=0, stdout=b'', stderr=b'')

pwd 命令主要是测试它是否会 return 任何种类的烈性黑啤酒,它不会被保留。

我查看了子进程的文档,但没有看到任何表明它无法捕获多个标准输出的信息。此外,根据日志,CompletedProcess 在不到 10 毫秒的时间内完成 return,而在我的机器上 运行ning cd ~path/to/kafka_2.11-2.1.0; pwd; ./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group groupname 大约需要 10-15 秒。

请注意,我使用的是 python3.5.2

我发现了我的错误。 cd 不适用于 subprocess,但 subprocess 提供了 cwd 命名参数,它接受 运行 参数所需的路径。它如此快地返回 CompletedProcess 的原因是它成功地更改了目录,然后退出了子进程。

抱歉,我没想到 cd 是罪魁祸首,直到我遇到 this question 也回答了我的问题。

你的错误比你想象的更根本。您的代码运行

sh -c 'cd'

其中 [=12=] 设置为目录,</code> 设置为 <code>pwd;,等等;所以 非常 与您想要的相去甚远。 (只是 cd 简单地切换到您的主目录;然后 shell 退出,而不对您传入的所有参数做任何事情,并且 Python 继续回到您启动之前的当前目录子进程。)

通常,使用 shell=True 传递单个字符串作为第一个参数,如果没有 shell.

,则传递一个字符串列表
subprocess.run(r"cd foo; pwd; use shell commands to your heart\'s content; run as many processes as you like as subprocesses of your shell subprocess", shell=True)
subprocess.run(['/bin/echo', 'one', 'single', 'process', 'with', 'arguments])