Подпроцесс Python добавляет дополнительные кавычки к моим аргументам оболочки - PullRequest
3 голосов
/ 17 июня 2011

Ожидаемое поведение

В обычных условиях я могу выдать tshark -E separator='@' под linux См. Примечание 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(), колонизировать и раскрашивать на основе некоторого анализа ... весь мой анализ зависит от выводабудучи разделенным @ при запуске сценария ... однако мой сценарий не , использующий @ ... вместо этого он использует одинарную кавычку;Я не уверен, что понимаю, почему это происходит.

Сценарий

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 ?


End-Notes

Примечание 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() не являются тем, что я ищу

1 Ответ

6 голосов
/ 17 июня 2011

Тшарк принимает ' от '%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 их не видит.

...