【问题标题】:os.system giving weird output in linuxos.system 在 linux 中给出奇怪的输出
【发布时间】:2020-09-18 09:32:23
【问题描述】:

我在 suse linux 中运行这个 python 函数来从 /etc/hosts grep 节点的 ip--

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

而不是

192.168.10.10

如果我运行 shell 命令

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

直接在linux命令提示符下,它给出的o/p as

192.168.10.10

【问题讨论】:

  • 从系统字符串命令中删除反引号:"cat /etc/hosts | egrep -i mm | grep om | awk '{print $1}'"
  • 为什么一开始这里有反引号?严肃的问题;我不认为我们有一个规范的实例来关闭这个常见的重复错误,但我们真的应该这样做。不过,我无法写出令人信服的例子,因为我首先不理解为什么有人会编写这段代码,而且我从未见过任何解释。

标签: python linux os.system


【解决方案1】:

反引号告诉外壳程序捕获输出并在命令行上使用它,通常作为命令的参数,如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())

【讨论】:

    【解决方案2】:
    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()
    

    【讨论】:

    • 请注意,只运行 awk '/mm/ && /om/ { print $1 }' </etc/hosts 而不需要 cat 或 grep 会更有效。
    • 这不起作用,因为os.system() 返回已完成进程的状态,而不是其输出。
    • 嘿,那也是。真的应该切换到subprocess.run
    猜你喜欢
    • 2014-01-21
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多