python subprocess.call 参数问题
python subprocess.call arguments issue
我正在 Linux 下编写一个简单的 python 脚本,使用 subprocess
.
对我子网上的主机执行一批并发的单个 ping
手动执行命令:
ping -c 1 192.168.68.1
脚本::
#!/usr/bin/python
from subprocess import call
path = "ping"
flags = "-c 1 "
for i in range(1,3):
ip_addr = "192.168.68." + str(i)
args = flags + ip_addr
print "doing: {} {}".format(path, args)
call([path, args])
注释掉调用输出预期的结果:
doing: ping -c 1 192.168.68.1
doing: ping -c 1 192.168.68.2
对于 call()
,脚本似乎调用了 ping 但参数未知。输出如下:
doing: ping -c 1 192.168.68.1
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
doing: ping -c 1 192.168.68.2
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
似乎 ping
每次迭代都被调用两次,args
与我的预期不同。我注意到 ping 抱怨的 -6
参数。
我将不胜感激任何帮助,特别是在正确使用 call()
方面。
更新:
添加了我试图模拟的 bash 脚本:
#!/bin/bash
for ip in $(seq 1 2); do
ping -c 1 192.168.68.$ip &
done
传递给函数 call
的参数都应该是列表中的单个元素,例如:
call(['ping','-c','1','192.168.68.2'])
我无法在我的环境中重现 'double printing'。
正如@Pablo 提到的 flags
和 path
变量应该是一个列表元素,所以在调用 call
方法之前只需将您的命令字符串转换为列表:
path = "ping"
flags = "-c 1"
cmd_list = [path] # convert string to list
cmd_list = cmd_list + flags.split(' ') # converting your flags string to list elements
call(cmd_list)
我正在 Linux 下编写一个简单的 python 脚本,使用 subprocess
.
手动执行命令:
ping -c 1 192.168.68.1
脚本::
#!/usr/bin/python
from subprocess import call
path = "ping"
flags = "-c 1 "
for i in range(1,3):
ip_addr = "192.168.68." + str(i)
args = flags + ip_addr
print "doing: {} {}".format(path, args)
call([path, args])
注释掉调用输出预期的结果:
doing: ping -c 1 192.168.68.1
doing: ping -c 1 192.168.68.2
对于 call()
,脚本似乎调用了 ping 但参数未知。输出如下:
doing: ping -c 1 192.168.68.1
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
doing: ping -c 1 192.168.68.2
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
似乎 ping
每次迭代都被调用两次,args
与我的预期不同。我注意到 ping 抱怨的 -6
参数。
我将不胜感激任何帮助,特别是在正确使用 call()
方面。
更新:
添加了我试图模拟的 bash 脚本:
#!/bin/bash
for ip in $(seq 1 2); do
ping -c 1 192.168.68.$ip &
done
传递给函数 call
的参数都应该是列表中的单个元素,例如:
call(['ping','-c','1','192.168.68.2'])
我无法在我的环境中重现 'double printing'。
正如@Pablo 提到的 flags
和 path
变量应该是一个列表元素,所以在调用 call
方法之前只需将您的命令字符串转换为列表:
path = "ping"
flags = "-c 1"
cmd_list = [path] # convert string to list
cmd_list = cmd_list + flags.split(' ') # converting your flags string to list elements
call(cmd_list)