【发布时间】:2019-07-29 15:28:29
【问题描述】:
我想从 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: Syntax error: word unexpected (expecting ")"),而从 bash 运行它时运行良好。我还尝试在命令的头部添加/bin/bash,但没有奏效。
当使用os.system('bash "{}"'.format(cmd)) 时,它并没有因上一个错误而崩溃,但循环不正确地展开(它打印了 1..254 而不是使用它们作为 IP 后缀)
我设法通过将命令保存在 bash 脚本中然后从 python 调用脚本来使其工作,但我宁愿直接这样做。这里有什么问题?
【问题讨论】:
-
您对
cmd的分配甚至不是有效的Python。 -
time是一个 bash 内置函数。不能保证在其他 shell 中会/做您期望的事情,特别是包括/bin/sh。 -
@CharlesDuffy 在验证这是我与
which time一起使用的time之后,我也尝试使用/usr/bin/time -
@CIsForCookies,
/usr/bin/time有不同的语法。您不能像使用内置命令那样将复合命令传递给它。 (另一方面,您可以使用['time', 'sh', '-c', cmd];这样您就可以向它传递一个简单的命令,sh)。 -
另外,
which time在这种情况下完全没用/毫无意义;which甚至不知道 shell 函数、内置函数或别名存在。如果您想知道您在 bash 中使用的time的实现,您需要type time,而不是which time。
标签: python bash python-2.7