2015-05-04 2 views
0

Я использую Python для выполнения sed delete/replace с помощью подпроцесса. Почему-то я не получаю правильное количество побегов. Вот мой код:Escaping в подпроцессе Python для команды sed

from subprocess import call 

remover = ["sed", "-i", "'1d'", "file"] 
call(remover) 

removeq = ["sed", "-i", "'s/\"//g'", "file"] 
call(removeq) 

Обе эти задачи производят сообщение об ошибке:

sed: -e expression #1, char 1: unknown command: `'' 

Сколько раз делает "знак нужно экранировать в первом списке и сколько раз делает" должны быть экранированы в последний? Я попробовал один раз, два и три раза, но безрезультатно. Там также нет скрытых символов, которые потенциально могут испортить что-нибудь.

Любые предложения?

+0

Одиночные кавычки указаны неверно. Они используются при запуске команды в оболочке для цитирования слова, но при непосредственном выполнении (без оболочки) они рассматриваются как буквенные символы и путают 'sed' (как видно). –

+0

Возможный дубликат [вызов подпроцесса ошибки команды sed] (http://stackoverflow.com/questions/25522639/subprocess-call-of-sed-command-giving-error) – tripleee

+2

«Я использую Python для выполнения sed delete/заменить на ... «Почему? Просто сделайте это изначально в Python ... – twalberg

ответ

3

Зафиксируйте механизм цитирования:

sed -i 's/\"//g' file 

Должно быть просто:

sed -i 's/"//g' file 

Вы также можете взять adventage из shlex библиотеки. Пример от переводчика:

>>> import shlex 
>>> cmd = "sed -i '1d' file" 
>>> shlex.split(cmd) 
['sed', '-i', '1d', 'file'] 
>>> cmd = """sed -i 's/"//g' file""" 
>>> shlex.split(cmd) 
['sed', '-i', 's/"//g', 'file'] 
+0

'shlex' не очень сложный. [Это может легко сломаться: 'r'echo '\ $ x"' '] (http://stackoverflow.com/questions/28468807/python-executing-a-shell-command#comment45287698_28468860) – jfs