Python子流程将额外的引号添加到我的shell参数中 预期行为

Python子流程将额外的引号添加到我的shell参数中 预期行为,python,linux,tcp,subprocess,wireshark,Python,Linux,Tcp,Subprocess,Wireshark,在正常情况下,我可以在linuxSee注释A下发出tshark-E separator='@',并强制它显示由@分隔的字段,如下所示 [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.16

在正常情况下,我可以在linuxSee注释A下发出
tshark-E separator='@'
,并强制它显示由
@
分隔的字段,如下所示

[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和colorify运行相同的命令。。。我所有的分析都取决于运行脚本时输出被
@
分隔。。。但是,我的脚本没有使用
@
。。。相反,它使用单一的报价;我不确定我是否理解为什么会发生这种情况

脚本

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('@')#绝望尝试;-)
问题: 谁能解释一下:

  • 为什么我的输出没有在上面的脚本中用
    @
    分隔
  • 如何使用
    子流程修复脚本
    请参见备注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没有看到它们。

    我敢打赌,您的Python代码正在发送@。你和strace联系过了吗?+1是一个有趣的挑战。现在回到我的工作:^)