¿Por qué el carácter ‘^’ se ignora en Python Popen – cómo escapar el carácter ‘^’ en Popen Windows?

Preparé algo de código para ejecutar dicha línea de comando:

c:\cygwin\bin\convert "c:\root\dropbox\www\tiff\photos\architecture\calendar-bwl-projekt\bwl01.tif" -thumbnail 352x352^ -format jpg -filter Catrom -unsharp 0x1 "c:\root\dropbox\www\tiff\thumbnails\architecture\calendar-bwl-projekt\thumbnail\bwl01.jpg" 

Esto funciona bien desde la línea de comandos (el mismo comando anterior), pero 352×352 ^ es 352×352 ^ no 352×352:

 c:\cygwin\bin\convert "c:\root\dropbox\www\tiff\photos\architecture\calendar-bwl-projekt\bwl01.tif" -thumbnail 352x352^ -format jpg -filter Catrom -unsharp 0x1 "c:\root\dropbox\www\tiff\thumbnails\architecture\calendar-bwl-projekt\thumbnail\bwl01.jpg" 

Si ejecuta este código desde Python, el carácter ‘^’ se ignora y el tamaño de la imagen tiene un tamaño tal que se pasa ‘% sx% s’ no% sx% s ^ – ¿Por qué Python corta el carácter ‘^’ y cómo evitarlo? :

 def resize_image_to_jpg(input_file, output_file, size): resize_command = 'c:\\cygwin\\bin\\convert "%s" -thumbnail %sx%s^ -format jpg -filter Catrom -unsharp 0x1 "%s"' \ % (input_file, size, size, output_file) print resize_command resize = subprocess.Popen(resize_command) resize.wait() 

¿Por qué Python corta el carácter ‘^’ y cómo evitarlo?

Python no corta carácter ^ Popen() pasa la cadena ( resize_command ) a CreateProcess() llamada a la API de Windows como es.

Es fácil de probar:

 #!/usr/bin/env python import sys import subprocess subprocess.check_call([sys.executable, '-c', 'import sys; print(sys.argv)'] + ['^', '<-- see, it is still here']) 

El último comando usa subprocess.list2cmdline() que sigue las reglas de Parsing C Command-Line Arguments para convertir la lista en la cadena de comando; no tiene efecto en ^ .

^ no es especial para CreateProcess() . ^ es especial si usa shell=True (cuando se ejecuta cmd.exe ) .

si y solo si la línea de comandos producida será interpretada por cmd, prefije cada metacarácter de shell (o cada carácter) con un carácter ^ . Incluye ^ sí mismo.