为了账号安全,请及时绑定邮箱和手机立即绑定

无法将特殊字符传递给python中的子进程

无法将特殊字符传递给python中的子进程

MMTTMM 2023-02-22 15:10:21
我有这个命令可以获取从 Unix shell 返回的外部 IP 地址,所以我可以在我的服务器中使用它:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'在我的 Mac 上,终端返回:192.168.1.3我如何在 python 脚本中输出这个?我努力了:import subprocesscommand = ['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p']p = subprocess.Popen(command, stdout=subprocess.PIPE)text = p.stdout.read()retcode = p.wait()我得到错误说ifconfig: 界面 | 不存在提前致谢!
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

您的 shell 命令正在调用两个命令, 的输出ifconfig用作sed. 您可以使用 subprocess 来模拟它,但sed调用只是进行一些文本操作,因此更简洁的方法是在该步骤中使用 Python。例如:


import re

import subprocess


pattern = r'inet (?:addr:)?(?!127\.0\.0\.1)((?:\d+\.){3}\d+)'


p = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE)

text = re.search(pattern, p.stdout.read()).group(1)

retcode = p.wait()


查看完整回答
反对 回复 2023-02-22
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

您正在尝试调用 2 个 shell 命令,ifconfig并且sed,没关系。但是,这些是 shell 命令,在调用subprocess.Poen.


使用communictae方法,最好用在这里。并将命令作为字符串而不是列表发送。


import subprocess


command = ' '.join(['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'])

p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)

stdoutdata, stderrdata = p.communicate()  #this is blocking

for line in stdoutdata:

    #do some thing with line

Popen.communicate(input=None)


与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件末尾。等待进程终止。可选的输入参数应该是一个要发送给子进程的字符串,如果没有数据应该发送给子进程,则为 None。


查看完整回答
反对 回复 2023-02-22
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信