我有要从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调用该脚本来使其工作,但是我宁愿直接这样做。这是什么问题?
答案 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())