分割Python应该使用os命令

时间:2018-08-17 08:10:50

标签: python python-3.x python-2.7 python-os

我正在python上编写代码,该python使用os.system(command)调用日志文件VXT_CDR_1_1_20180816.DAT

代码在这里

import os
command = "cat /home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT | awk -F'|' '{print $3}' |sort|uniq"  
output= os.system(command)
#data = str(output)

for d in str(output).split():
  print(d)

os.system(命令)返回整数,并且str(output)不会将int转换为字符串并返回0。

请帮助解决此问题。

2 个答案:

答案 0 :(得分:2)

os.system()只需运行命令,而无需将其标准输出连接到Python,仅返回一个小数字,指示命令是否成功(零表示成功)。

如果要使其输出可用于Python,则正在寻找subprocess.run()或更早的版本(如果您需要2.7之前的Python,那么这会很麻烦)。

from subprocess import run, PIPE
# refactor to avoid useless cat
command = "awk -F'|' '{print $3}' /home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT |sort|uniq"  
result = run(command, shell=True, stdout=PIPE, universal_newlines=True)
# No need to split on newlines just so you can print a newline after each line
print(result.stdout)

对于早期版本的Python,请查看subprocess.check_output(),或者在最坏的情况下,请使用subprocess.Popen()重新实现它。

我们通常dissuade people from using shell=True,但是在这种情况下,通过在Python中重新实现Shell的管道功能来摆脱它是适度的挑战。但是,这里没有Python本身无法做的任何事情,因此最简单的解决方法是首先不使用外部工具。

with open('/home/smslog/CDRS/VXT_CDR_1_1_20180816.DAT') as input:
    values = dict()
    for line in input:
        values[line.rstrip('\n').split('|')[2]] = 1
for value in sorted(values.keys()):
    print(value)

收集字典中的值是使某些内容唯一的常见模式。如果该值已存在于字典中,则我们不会通过用相同的信息覆盖它来添加任何新内容。在循环的最后,字典values的键是唯一的输入。

答案 1 :(得分:0)

要获取命令输出,可以使用subprocess.check_output()函数,将shell = True kwarg传递给它。