python subprocess.popen:使用shell=true运行多个命令,但似乎并不等待所有命令完成

pvcm50d1  于 2021-06-04  发布在  Kafka
关注(0)|答案(2)|浏览(821)

我正在尝试使用subprocess.popen对kafka使用者组运行检查并记录其状态,但它似乎没有等待所有命令运行。它没有给我任何标准输出,但它也返回一个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命令主要是测试它是否会返回任何类型的stout,它不会被保留。
我已经在文档中查看了子流程,但没有看到任何迹象表明它无法捕获多个标准输出。另外,根据日志,在运行过程中,completedprocess将在不到10ms的时间内返回 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

s71maibg

s71maibg1#

我发现了我的错误。 cd 不适用于子流程,但子流程提供了cwd命名参数,该参数接受运行参数所需的路径。它如此快速地返回completedprocess的原因是它成功地更改了目录,然后退出了子进程。
对不起,我没有想到cd是罪魁祸首,直到我遇到这个问题,这也回答了我的问题。

iszxjhcz

iszxjhcz2#

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

sh -c 'cd'

$0 设置为目录, $1 设置为 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])

相关问题