首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3子进程输出

Python3子进程输出
EN

Stack Overflow用户
提问于 2013-08-14 23:43:40
回答 5查看 92.5K关注 0票数 65

我希望运行Linux实用程序wc来确定/var/log/syslog中当前的行数,这样我就可以检测到它在增长。我尝试过各种测试,在从wc获得结果的同时,它还包括行计数和命令(例如var/log/syslog)。

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

我试过把它从字节串转换成字符串,然后去掉结果,但没有joy。同样的故事,转换为字符串和剥离,解码等-都无法产生输出,我正在寻找。

下面是我得到的一些例子,在syslog中有1338行:

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

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

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-15 00:27:39

我建议您使用subprocess.getoutput()来做您想做的事情--在shell中运行一个命令并获得它的字符串输出 (与字节串输出相反)。然后您可以从返回的字符串列表中获取在空格上拆分和第一个元素。

试试这个:

代码语言:javascript
复制
import subprocess
stdoutdata = subprocess.getoutput("wc --lines /var/log/syslog")
print("stdoutdata: " + stdoutdata.split()[0])
票数 81
EN

Stack Overflow用户

发布于 2018-09-13 11:23:54

由于Python3.6可以使check_output()返回一个str而不是bytes,方法是给它一个编码参数:

代码语言:javascript
复制
check_output('wc --lines /var/log/syslog', encoding='UTF-8')

但是,由于您只需要计数,而且split()int()都可以用于bytes,所以您不需要费心编码:

代码语言:javascript
复制
linecount = int(check_output('wc -l /var/log/syslog').split()[0])

虽然使用外部程序可能更容易(例如,计算由journalctl打印的日志行条目),但在这种特殊情况下,您不需要使用外部程序。最简单的Python解决方案是:

代码语言:javascript
复制
with open('/var/log/syslog', 'rt') as f:
    linecount = len(f.readlines())

这样做的缺点是,它会将整个文件读入内存;如果它是一个巨大的文件,那么在打开文件之前初始化linecount = 0,然后使用for line in f: linecount += 1循环而不是readlines(),以便在计算时将文件的一小部分保存在内存中。

票数 29
EN

Stack Overflow用户

发布于 2013-08-16 10:09:19

为了避免在*nix上调用可能是任意字节序列('\0'除外)的shell和解码文件名,您可以将文件作为stdin传递:

代码语言:javascript
复制
import subprocess

with open(b'/var/log/syslog', 'rb') as file:
    nlines = int(subprocess.check_output(['wc', '-l'], stdin=file))
print(nlines)

或者您可以忽略任何解码错误:

代码语言:javascript
复制
import subprocess

stdoutdata = subprocess.check_output(['wc', '-l', '/var/log/syslog'])
nlines = int(stdoutdata.decode('ascii', 'ignore').partition(' ')[0])
print(nlines)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18244126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档