python脚本里执行linux命令的时候如何调用python的函数?

 叶斯琪147- 发布于 2022-10-27 07:15

本菜鸟有一个可以获取ip地址的脚本,如下:

def get_local_ip(ifname = 'eth1'):
    import socket, fcntl, struct
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    inet = fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))
    ret = socket.inet_ntoa(inet[20:24])
    return ret

print get_local_ip()

现在有一个任务,就是在linux里把一个relay.conf文件里的“RELAY_AGENT_IP = ”替换成“RELAY_AGENT_IP = 当前IP地址”,这个用sed语句很好解决:os.system("sed -i s/RELAY_AGENT_IP =/RELAY_AGENT_IP = 当前IP地址/ relay.conf")即可,但是get_local_ip()是一个函数啊,函数无法直接套用到上面那个sed语句,会报语法错误。

请问遇到这样的情况怎么破?肯定各位大大指点。

3 个回答
  • 首先你这个get_local_ip函数有问题, 并不能正常获取到本地IP地址, 建议看下这里的解决方法:
    http://stackoverflow.com/ques...

    还有你这个sed用的也不对啊, 语法有问题(缺了双引号), 应该是这样
    sed -i "s/RELAY_AGENT_IP =/RELAY_AGENT_IP = 当前IP地址/" relay.conf
    而且这条命令只能是把
    RELAY_AGENT_IP =这个替换成RELAY_AGENT_IP = 当前IP地址而已, 如果你的relay.conf文件这一行原本就有IP地址值呢?比如这样RELAY_AGENT_IP = 1.2.3.4照你这个命令替换完是这个样子RELAY_AGENT_IP = 当前IP地址1.2.3.4, 为了有一定的错误格式容忍度, 最好用正则来匹配, 比如
    sed -i "s/^RELAY_AGENT_IP.*/RELAY_AGENT_IP = 我爱北京天安门/" relay.conf

    $ cat relay.conf
    RELAY_AGENT_IP = 我爱北京天安门
    $ sed "s/^RELAY_AGENT_IP.*/RELAY_AGENT_IP = 天安门上太阳升/" relay.conf
    RELAY_AGENT_IP = 天安门上太阳升
    2022-10-27 07:16 回答
  • os.system("sed -i s/RELAY_AGENT_IP =/RELAY_AGENT_IP = %s/ relay.conf"%(get_local_ip()))
    2022-10-27 07:16 回答
  • 上面的回答就可以,使用string模板就可以了,或者这样子的表达方式更友好:

    os.system("sed -i s/RELAY_AGENT_IP =/RELAY_AGENT_IP = {}/ relay.conf".format(get_local_ip()))
    2022-10-27 07:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有