运行os.system / subprocess.call返回语法错误

时间:2019-03-07 16:48:31

标签: python bash python-2.7

我有要从Python2.7运行的bash命令:

time ( s=172.20.16 ; for i in $(seq 1 254) ; do ( ping -n -c 1 -w 1 $s.$i 1>/dev/null 2>&1 && printf "%-16s %s\n" $s.$i responded ) & done ; wait ; echo ) 

我试图这样运行它:

cmd = 'time ( s=172.20.16 ; for i in $(seq 1 254) ; do ( ping -n -c 1 -w 1 $s.$i 1>/dev/null 2>&1 && printf "%-16s %s\n" $s.$i responded ) & done ; wait ; echo )'

#1. subprocess.call(cmd.split())
#2. subprocess.call(cmd, shell=True)
#3. os.system(cmd)

但是所有返回的 / bin / sh:1:语法错误:单词意外(期望“)”),而从bash运行时,则可以正常工作。我还尝试将/bin/bash添加到命令的开头,但这没用。

在使用os.system('bash "{}"'.format(cmd))时,它并没有因先前的错误而崩溃,但是循环以不可压缩的方式展开(打印了1..254,而不是将其用作IP后缀)

我设法通过将命令保存在bash脚本中,然后从python调用该脚本来使其工作,但是我宁愿直接这样做。这是什么问题?

3 个答案:

答案 0 :(得分:2)

shell=True使用/bin/sh/bin/sh不是bash

将Shell脚本的所有问题留在原处,但使用bash调用它,将类似于以下内容:

cmd = 'time ( s=172.20.16 ; for i in $(seq 1 254) ; do ( ping -n -c 1 -w 1 $s.$i 1>/dev/null 2>&1 && printf "%-16s %s\n" $s.$i responded ) & done ; wait ; echo )'
subprocess.call(['bash', '-c', cmd])

将其重写为实际上更好的shell脚本可能看起来像这样:

cmd = r'''
time {
  s=172.20.16
  for ((i=1; i<=254; i++)); do
    { ping -n -c 1 -w 1 "$s.$i" >/dev/null 2>&1 && \
      printf "%-16s %s\n" "$s.$i" "responded"
    } &
  done
  wait
  echo
}
'''
subprocess.call(['bash', '-c', cmd])

请注意,我们使用{ ...; }而不是( ... )进行分组(因此避免了不必要的子shell创建);并且我们总是在 引用替换。

答案 1 :(得分:0)

您正在按空间划分以构造用于suprocess调用方法的命令/参数数组;但请注意,有些参数包含空格,因此应将其视为一个参数,而不是两个(即"%-16s %s\n"

答案 2 :(得分:-1)

尝试根据此链接Running Bash commands in Python

使用子流程
import subprocess
subprocess.call("{}".format(cmd).split())