【问题标题】:bash command runs through cli fine but not running inside python scriptbash 命令可以很好地通过 cli 运行,但不能在 python 脚本中运行
【发布时间】:2018-09-17 08:21:40
【问题描述】:

这是 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

【问题讨论】:

  • 错过了 python shebang?
  • 当python可以做同样的事情时,你为什么要从python调用awk。
  • 没有awk怎么办
  • 我不太了解 Python,因此只是评论而不是答案,但我认为 Python 使用 /bin/sh 而不是 bash 作为外壳,我认为 &lt;(...) 是 @ 987654326@.
  • @MarkSetchell 这两点都完全正确。

标签: python linux bash python-2.7


【解决方案1】:

Popen 默认使用 POSIX shell /bin/sh 执行其命令。它无法识别bash 扩展&lt;(...),从而导致您的错误。最快的解决方法是指定您要使用/bin/bash 作为外壳:

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 脚本。

【讨论】:

  • 它仍然无法正常工作,感谢您的帮助,但现在它给了我这个错误。 /bin/sh: 5: 语法错误:未终止的带引号的字符串
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2013-03-06
  • 2019-02-22
相关资源
最近更新 更多