gpt4 book ai didi

python 子进程输出被截断

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:57 27 4
gpt4 key购买 nike

当使用子进程在 python 中运行 shell 命令时,我得到了错误的输出。

bash shell 中的 grep (com.vertica.solutions.kafka.Launcher)

ps -ef | grep com.vertica.solutions.kafka.Launcher
root 92300 39024 0 23:06 pts/1 00:00:00 grep --color=auto com.vertica.solutions.kafka.Launcher
dbadmin 413872 413868 0 22:06 pts/0 00:00:24 java -cp /opt/vertica/packages/kafka/bin/../lib/*:/opt/vertica/java/lib/vertica-jdbc.jar:/opt/vertica/packages/kafka/bin/../config/* -Dlog4j.configurationFile=/opt/vertica/packages/kafka/bin/../config/vkafka-log-config.xml -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector com.vertica.solutions.kafka.Launcher --conf /home/dbadmin/live.conf

python shell 中的 grep (com.vertica.solutions.kafka.Launcher)

>>> cmd = "ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep"
>>> check_output(cmd,shell=True).strip()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep' returned non-zero exit status 1

这是因为子进程正在截断 ps 输出。当我用 kafka 一词进行 grep 时,我得到了结果,但它不是我想要的。

仅 grep kafka

>>> cmd = "ps aux | grep kafka | grep -v grep"
>>> check_output(cmd,shell=True).strip()
dbadmin 413868 0.0 0.0 113128 1372 pts/0 S 22:06 0:00 /bin/bash /opt/vertica/packages/kafka/bin/vkconfig launch --conf /home/dbadmin/live.conf\n
dbadmin 413872 0.6 1.0 7403000 175544 pts/0 Sl 22:06 0:25 java -cp /opt/vertica/packages/kafka/bin/../lib/*:/opt/vertica/java/lib/vertica-jdbc.jar:/opt/vertica/package'

当我仅使用单词 kafka 进行 grep 时,我得到了进程(pid 413872),但在 python shell COMMAND 列中,进程命令的输出不完整。

最佳答案

子进程不会截断 任何写入stdout 的内容,它会通过管道传输到您的python session 。发生的事情是 -v 不成功,因此它以错误的返回代码(无零)退出。

要忽略您没有从 grep 获得任何输出的情况,您可以执行以下操作:

import os
from subprocess import Popen

DEVNULL = open(os.devnull, 'wb')
cmd = 'ps aux |grep com.vertica.solutions.kafka.Launcher| grep -v grep'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=DEVNULL, shell=True)
print process.communicate()[0] #output

这将确保万一 grep 不成功,它不会返回错误代码,而只会转储它。

关于python 子进程输出被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com