![](/img/trans.png)
[英]Passing shell commands in python subprocess.Popen() with two quoted words
[英]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 消费者组进行检查并记录他们的状态,但它似乎没有等待所有命令运行。 它没有给我任何标准输出,但它也返回 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 命令主要是测试它是否会返回任何类型的粗壮,它不会被保留。
我已经查看了子流程的文档,但没有看到任何表明它无法捕获多个标准输出的内容。 此外,根据日志,在运行cd ~path/to/kafka_2.11-2.1.0; pwd; ./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group groupname
,CompletedProcess 在不到 10 毫秒内返回cd ~path/to/kafka_2.11-2.1.0; pwd; ./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group groupname
cd ~path/to/kafka_2.11-2.1.0; pwd; ./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group groupname
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
不适用于子进程,但子进程提供 cwd 命名参数,该参数接受运行参数所需的路径。 它如此快速地返回 CompletedProcess 的原因是它成功地更改了目录,然后退出了子进程。
抱歉,在我遇到这个问题也回答了我的问题之前,我没想到 cd 是罪魁祸首。
你的错误比你想象的更根本。 你的代码运行
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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.