os.system(命令)不返回输出

问题描述 投票:0回答:2

我正在用Python编写代码,该代码正在使用

VXT_CDR_1_1_20180816.DAT
处理日志文件
os.system(command)

代码在这里

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(command)
返回一个整数,并且
str(output)
不会将 int 转换为字符串并返回 0。

python python-3.x subprocess
2个回答
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()
重新实现它。

我们通常会劝阻人们不要使用

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
的键是唯一的输入。


0
投票

要获取命令输出,您可以使用

subprocess.check_output()
函数并将 shell=True kwarg 传递给它。

© www.soinside.com 2019 - 2024. All rights reserved.