os.system在linux中给出奇怪的输出

问题描述

我正在suse linux中运行此python函数,以从/ etc / hosts中对节点的grep ip进行压缩-

fun("HELLO WORLD")
#> [1] "hello world"

结果是显示了这个奇怪的输出

def mm_node():
    import os
    node_name = os.system("`cat /etc/hosts | egrep -i mm | grep om | awk '{print $1}'`")
    return node_name

mm_node() 

代替

sh: 192.168.10.10: command not found

如果我运行shell命令

192.168.10.10

直接在linux命令提示符下,将o / p赋予

cat /etc/hosts | egrep -i mm | grep om | awk '{print $1}'

解决方法

反引号告诉shell捕获输出并在命令行上使用它,通常将其用作命令的参数,例如grep `whoami` /etc/passwd。在您的情况下,命令行由反引号的管道组成,因此shell将管道的输出解释为要执行的命令。这就是为什么它抱怨IP地址“找不到”的原因。

如果您打算捕获要在Python代码中使用的管道的输出,则应使用subprocess模块,它是os.system的现代替代方案,可轻松捕获输出。例如:

import subprocess

def mm_node():
    output = subprocess.run(
        "cat /etc/hosts | egrep -i mm | grep om | awk '{print $1}'",shell=True,capture_output=True
    ).stdout
    return output.strip()

print(mm_node())
,
def mm_node():
    import os
    node_name = os.system("cat /etc/hosts | egrep -i mm | grep om | awk '{print $1}'")
    return node_name

mm_node()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...