Evite el subprocess.Pobre auto escapando mis barras invertidas en grep

Estoy tratando de escribir un enlace svn pre-commit en python. Parte de esto implica verificar el file diff para ver si hay algún cambio real en el file (en lugar de solo cambios de propiedad).

Tengo un command grep de trabajo que puedo ejecutar bien en el shell

grep "^\(Added: \|Modified: \|Deleted: \)" diff filename | grep -v 'svn:' 

Sin embargo, cuando lo paso por un subprocess, abre todas mis barras diagonales, lo que destruye la expresión regular.

 Executing command: ['grep', '"^\\Added: \\|Modified: \\|Deleted: \\)", ...] 

¿Cómo evito esto?

NB: Soy consciente de que puedo canalizar resultados entre subprocesss y puedo hacer los dos greps de esa manera. Sin embargo, necesito ayuda para que el primero trabaje primero: /

NB2: También intenté usar filterdiff –clean en su lugar y no pude hacerlo funcionar. La búsqueda de líneas añadidas, modificadas o eliminadas, eliminar aquellas con 'svn:' y verificar que tenía algunos resultados parecía funcionar bien.

Código de Python:

 command = ['grep', '"^\(Added: \|Modified: \|Deleted: \)"', filename] sys.stdout.write('Executing command: %s\n' % (command)) p = subprocess.Popen(command, stdin = subprocess.PIPE stdout = subprocess.PIPE stderr = subprocess.STDOUT shell = True) data = p.stdout.read() if len(data) == 0: sys.stdout.write("Diff does not contain any file modifications./n") exit(0) 

Debe considerar lo que quiere grep para ver en sus arguments de command-line.

El primer argumento debe ser la cadena literal "^\(Added: \|Modified: \|Deleted: \)" , por lo que significa que no debe include las comillas dobles, sino que debe include las barras diagonales inversas.

La forma de express este tipo de cadena es usar cadenas de Python raw:

 command = ['grep', r'^\(Added: \|Modified: \|Deleted: \)', filename] 

Una buena forma de verificar lo que está ejecutando en realidad es replace grep por echo para que al less pueda ver lo que está pasando al command.