【问题标题】:Python subprocess.Popen : Running multiple commands with shell=True, but it doesn't seem to be waiting for all commands to completePython subprocess.Popen:使用 shell=True 运行多个命令,但似乎并没有等待所有命令完成
【发布时间】:2021-02-03 14:38:51
【问题描述】:

我正在尝试使用 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 在不到 10 毫秒内返回,而在我的机器上运行 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

【问题讨论】:

    标签: python apache-kafka subprocess python-3.5


    【解决方案1】:

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

    sh -c 'cd'
    

    $0设置为目录,$1设置为pwd;等;所以非常远离你想要的。 (只需 cd 切换到您的主目录;然后 shell 退出,对您传入的所有参数不做任何操作,Python 继续返回到您启动子进程之前的当前目录。)

    通常,将单个字符串作为shell=True 的第一个参数传递,如果没有外壳,则传递字符串列表。

    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])
    

    【讨论】:

    • 酷,谢谢。我能够使用答案中的方法修复它,因为我不再需要 shell=True,并且由于它具有安全风险,所以我再次将其设置为 False。但是感谢您提供的其他信息,这对我的理解很有帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 在子进程短暂切换到子目录的意义上,它“有效”;但按照你的说法,这就是它在死前所做的一切。请参阅我的答案以获得更全面的解释。
    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 2014-09-08
    • 2011-09-20
    • 2013-04-03
    • 2012-03-12
    • 2016-07-07
    • 2013-11-02
    相关资源
    最近更新 更多