2012-03-21 3 views
2

Я пытаюсь выполнить следующую команду с помощью модуля подпроцесс (питон)команда находкой с Exec в питона подпроцесса дает ошибку

/usr/bin/find <filepath> -maxdepth 1 -type f -iname "<pattern>" -exec basename {} \; 

Но это дает следующее сообщение об ошибке:

/usr/bin/find: missing argument to `-exec' 

I я предполагаю, что это связано с побегом некоторых персонажей. Но не получить, как это преодолеть.

Любая помощь приветствуется. Благодарю.

+7

Укажите строку кода, где вы запускаете подпроцесс – wim

ответ

-2

запомнить спасаясь " требуется, а также избежать \ использовать до ; также требуется

ваша команда может выглядеть примерно так:

p1 = subprocess.Popen(["/usr/bin/find", "<filepath> -maxdepth 1 -type f -iname \"<pattern>\" -exec basename {} \\;"]) 
p1.communicate() 
+0

Если OP использует одинарные кавычки (' '') для строки, нет никакой необходимости, чтобы избежать двойные кавычки. –

+0

Спасибо. Одиночные кавычки вокруг всей командной строки работали. – shruthi

+0

Даже если вы преуспели, можете ли вы предоставить исходный код @shruthi? И как вы его исправили? – isaaclw

0

еще один намек: Использование синтаксиса r'bla»позволяет использовать обратная косая черта, не указывая их:

r'... -exec basename {} \;' 

Обеспечивает лучшую читаемость.

9

Ответ на другой вопрос помог: https://stackoverflow.com/a/15035344/971529

import subprocess 

subprocess.Popen(('find', '/tmp/mount', '-type', 'f', 
       '-name', '*.rpmsave', '-exec', 'rm', '-f', '{}', ';')) 

То, что я не мог понять, что с запятой не нужно экранировать, так как обычно запятая интерпретируется по bash, и нужно избегать.

В Баш это equivelent является:

find /tmp/mount -type f -name "*.rpmsave" -exec rm -f {} \; 
+2

Это работает для меня. Дело в том ';' вариант. –