Python3子进程输出

标签 python python-3.x subprocess

我想运行 Linux 字数统计实用程序 wc 来确定/var/log/syslog 中当前的行数,以便我可以检测到它正在增长。我尝试了各种测试,当我从 wc 中得到结果时,它包括行数和命令(例如,var/log/syslog)。

所以它正在返回: 第1338章 但我只想要行数,所以我想去掉/var/log/syslog 部分,只保留 1338。

我尝试将它从字节串转换为字符串,然后剥离结果,但没有任何乐趣。转换为字符串和剥离、解码等的相同故事 - 都无法产生我正在寻找的输出。

这些是我得到的一些示例,系统日志中有 1338 行:

  • b'1338/var/log/syslog\n'
  • 1338/var/log/syslog

这是我编写的一些测试代码,试图破解这个问题,但没有解决方案:

import subprocess

#check_output returns byte string
stdoutdata = subprocess.check_output("wc --lines /var/log/syslog", shell=True)
print("2A stdoutdata: " + str(stdoutdata))
stdoutdata = stdoutdata.decode("utf-8")
print("2B stdoutdata: " + str(stdoutdata))    
stdoutdata=stdoutdata.strip()
print("2C stdoutdata: " + str(stdoutdata))    

由此产生的输出是:

  • 2A 标准输出数据:b'1338/var/log/syslog\n'

  • 2B 标准输出数据:1338/var/log/syslog

  • 2C 标准输出数据:1338/var/log/syslog

  • 2D 标准输出数据:1338/var/log/syslog

最佳答案

我建议您使用 subprocess.getoutput(),因为它完全符合您的要求——在 shell 中运行命令并获取它的 string output (与 byte string 输出相反)。那么你可以split on whitespace并从返回的字符串列表中获取第一个元素。

试试这个:

import subprocess
stdoutdata = subprocess.getoutput("wc --lines /var/log/syslog")
print("stdoutdata: " + stdoutdata.split()[0])

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

相关文章:

python - 在python中打开应用程序时的错误处理

Python 子进程交互,为什么我的进程使用 Popen.communicate 而不是 Popen.stdout.read()?

python - Telegram webhooks POST 请求的负载为空

python - 类型错误 : Positional Arguments with pandas. 适用

Python:如何在不循环的情况下获得给定值的字典键?

python - 有没有办法在 Python 中中断 shutil copytree 操作?

python - json 格式转换为 float 列表

python - 如何获取 python-chess 模块中所有合法移动的列表?

python - 调用 pkill 以在 python 中的类中暂停具有子进程的进程会暂停 python 脚本

python - Python 的 argparse 可以像 gnu getopt 一样置换参数顺序吗?