bash命令运行cli正常但不在python脚本中运行

时间:2018-04-07 12:39:39

标签: python linux bash python-2.7

这是python脚本,它是从cli获取当前INTERNET速度并将其保存在python变量中的程序

from subprocess import PIPE, Popen

def cmdline(command):
    process = Popen(args=command,stdout=PIPE,shell=True)
    return process.communicate()[0]

aa=(cmdline("awk '{if(l1){print ($2-l1)/1024,($10-l2)/1024} else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1); <(grep eth0 /proc/net/dev)"))

print(str(aa))

给出错误

/bin/sh: 1: Syntax error: "(" unexpected

1 个答案:

答案 0 :(得分:2)

Popen默认使用POSIX shell /bin/sh执行其命令。它无法识别bash扩展程序<(...),这会导致您的错误。最快的解决方法是指定您要使用/bin/bash作为shell:

process = Popen(args=command, stdout=PIPE, shell=True, executable="/bin/bash")

更好的解决方案是坚持使用与POSIX兼容的命令,这样您的Python脚本就不会依赖bash安装在任何特定位置,或者根本不可能。像

这样的东西
cmd = '''{
  grep eth0 /proc/net/dev
  sleep 1
  grep eth0 /proc/net/dev
  } | awk '{if(l1){print ($2-l1)/1024,($10-l2)/1024} else{l1=$2; l2=$10;}}'
'''


aa=(cmdline(cmd))

最佳解决方案是找出如何在Python本身中执行您想要的操作,而不是嵌入shell脚本。