首页 > 编程语言 >Python之subprocess 执行报错

Python之subprocess 执行报错

时间:2023-01-11 16:14:19浏览次数:60  
标签:shell Python subprocess 括号 报错 print hosts

问题

我用subprocess 执行命令查 主机Ip 报错

​ command = """ "grep {0} /etc/hosts | awk '{print $1}' " """.format(socket.gethostname()) KeyError: 'print $1'

使用python 的subprocess 执行shell命令更具 主机名查询hosts文件中的ip

您可以使用 Python 库 subprocess 中的函数 run() 来执行 shell 命令,并将结果作为字符串返回。

Copy codeimport socket
import subprocess

hostname = socket.gethostname()
command = "grep {0} /etc/hosts | awk '{{print $1}}'".format(hostname)

result = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
ip = result.stdout.decode('utf-8').strip()
print(ip)

或者也可以使用subprocess.check_output

Copy codeimport socket
import subprocess

hostname = socket.gethostname()
command = "grep {0} /etc/hosts | awk '{{print $1}}'".format(hostname)

ip = subprocess.check_output(command, shell=True).decode('utf-8').strip()
print(ip)

这两种方式都是可以的,但是建议使用subprocess.run()

这段代码会构造一个命令,执行grep hostname /etc/hosts ,输出的第一个字段为 IP,然后使用subprocess执行命令,将stdout设置为subprocess.PIPE,结果会以字节形式返回,用.decode('utf-8').strip()转为string 并且去除首尾空格

值得注意的是,subprocess.Popen,subprocess.run都会接受shell=True 参数,但是建议使用subprocess.run 他是在后面版本推出的。

注意

在上面的 shell 命令中, {{ 和 }} 是花括号。在 Python 字符串中使用单个花括号 { 和 } 来表示字符串格式化,而在 shell 中,花括号被用来表示命令的嵌套。

为了在 Python 字符串中插入本应在 shell 中使用的花括号,就需要转义。在 Python 中,使用两个花括号 {{ 和 }} 来表示一个单独的花括号。

在这个例子中, {print $1} 表示 awk 命令的一部分,而不是 Python 字符串格式化的部分。使用 {{ 和 }} 来转义花括号可以保证命令在执行时得到正确的解释。

它同时保证了 python 的字符串格式化以及shell命令的正确性。

标签:shell,Python,subprocess,括号,报错,print,hosts
From: https://www.cnblogs.com/nwnusun/p/17044078.html

相关文章