NWNU-Sun | 技术沉思录

代码是诗,bug是谜

   ::  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  74 随笔 :: 49 文章 :: 6 评论 :: 40513 阅读

问题

我用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命令的正确性。

posted on   匿名者nwnu  阅读(1021)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示