运行操作系统/ 子流程调用返回语法

2024-09-25 10:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从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:语法错误:word unexpected(expected“)”,在从bash运行它时工作得很好。我还尝试在命令头中添加/bin/bash,但没有成功。你知道吗

当使用os.system('bash "{}"'.format(cmd))时,它没有因为前面的错误而崩溃,但是循环未正确展开(它打印了1..254,而不是将它们用作IP后缀)

我将命令保存在bash脚本中,然后从python调用该脚本,从而使它能够工作,但我更愿意直接这样做。这里有什么问题?你知道吗


Tags: indev命令cmdbashfortimeping
3条回答

您正在按空格拆分以构造suprocess call方法的命令/参数数组;但是请注意,有些参数包含空格,因此它应该算作单个参数,而不是两个参数(即此参数:"%-16s %s\n"

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创建),而且我们总是引用替换。你知道吗

请尝试按此链接使用子进程Running Bash commands in Python

import subprocess
subprocess.call("{}".format(cmd).split())

相关问题 更多 >