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

我有这个命令可以获取从 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 subprocess


command = ['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: 界面 | 不存在


提前致谢!


MMTTMM
浏览 74回答 2
2回答

绝地无双

您的 shell 命令正在调用两个命令, 的输出ifconfig用作sed. 您可以使用 subprocess 来模拟它,但sed调用只是进行一些文本操作,因此更简洁的方法是在该步骤中使用 Python。例如:import reimport subprocesspattern = 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()

吃鸡游戏

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 subprocesscommand = ' '.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 blockingfor line in stdoutdata:    #do some thing with linePopen.communicate(input=None)与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件末尾。等待进程终止。可选的输入参数应该是一个要发送给子进程的字符串,如果没有数据应该发送给子进程,则为 None。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python