Pythonsubprocess为我的shell参数添加额外的引号

预期的行为

在正常情况下,我可以在Linux下发行tshark -E separator='@' 请参阅注释A,并强制显示由@分隔的字段,如下所示…

 [mpenning@hotcoffee ~]$ tshark -r scp_test.pcap -e frame.number -e ip.src_host -e tcp.srcport -E separator='@' -T fields tcp | less 1@192.168.12.236@33088 2@192.168.12.238@22 3@192.168.12.236@33088 ... 

意外的行为

同样,我以为我会运行相同的命令通过subprocess.Popen() ,columnify,并着色基于一些分析…所有我的分析依赖于输出被分隔@当我运行脚本…但是,我的脚本使用@ …,而是使用单引号; 我不确定我明白为什么会发生这种情况。

脚本

 import subprocess import sys filename = sys.argv[1].strip() fields = ['frame_num', 'IP Src', 'TCP Src'] sep = '@' cmd = r"""tshark -r %s -e frame.number -e ip.src_host -e tcp.srcport -E separator='%s' -T fields tcp""" % (filename, sep) subcmd = cmd.split(' ') lines = subprocess.Popen(subcmd, stdout = subprocess.PIPE) for line in lines.communicate()[0].split('\n'): print line 

结果

 [mpenning@hotcoffee ~]$ python analyze.py scp_test.pcap | less 1'192.168.12.236'33088 2'192.168.12.238'22 3'192.168.12.236'33088 4'192.168.12.238'22 5'192.168.12.236'33088 6'192.168.12.236'33088 7'192.168.12.238'22 8'192.168.12.236'33088 

使用以下任何一种方式分配sep似乎并不重要…

  • sep = '@'
  • sep = '\@'
  • sep = re.escape('@') # Desperation attempt ;-)

有人可以解释:

  1. 为什么我的输出在上面的脚本中没有用@分开。
  2. 如何使用subprocess修复脚本请参阅注释B

最终注意事项

注A.系统信息:

 [mpenning@hotcoffee ~]$ python -V Python 2.6.6 [mpenning@hotcoffee ~]$ uname -a Linux hotcoffee 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64 GNU/Linux [mpenning@hotcoffee ~]$ 

注意B.使用os.system()os.popen()答案不是我正在寻找的

tshark正在从'%s' 。 不要使用单引号:

 cmd = r"tshark -r %s -e frame.number -e ip.src_host -e tcp.srcport -E separator=%s -T fields tcp" % (filename, sep) 

当你从命令行运行它时,Bash将单引号删除,tshark没有看到它们。