Python Subprocess在我的shell参数中添加了额外的引号

3

期望行为

在正常情况下,我可以在linux参见注释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() 运行相同的命令,基于一些分析进行列化和着色... 我所有的分析都依赖于脚本输出使用 @ 分隔... 但是,我的脚本并没有使用 @... 反而使用了单引号;我不确定为什么会出现这种情况。

脚本

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('@') # 绝望的尝试 ;-)

问题

有人能解释一下:

  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()的答案不是我想要的。


你的 Python 代码正在发送 @,我敢打赌。你用 strace 检查过了吗? - jcomeau_ictx
2
+1 为有趣的挑战。现在回到我的工作吧 :^) - jcomeau_ictx
1个回答

6

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则看不到它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接