Почему символ '^' игнорируется Python Popen - как экранировать символ '^' в Popen Windows?

Я подготовил некоторый код для выполнения такой командной строки:

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"

Это прекрасно работает из командной строки (та же команда, что и выше), но 352x352 ^ это 352x352 ^, а не 352x352:

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"

Если запустить этот код из python - символ "^" игнорируется, а изображение с измененным размером имеет размер, так как "% sx% s" передается не%sx%s^ - Почему Python вырезает символ "^" и как его избежать?:

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()

1 ответ

Решение

Почему Python режет символ '^' и как его избежать?

Питон не режет ^ персонаж. Popen() передает строку (resize_command) чтобы CreateProcess() Windows API вызывает как есть.

Это легко проверить:

#!/usr/bin/env python
import sys
import subprocess

subprocess.check_call([sys.executable, '-c', 'import sys; print(sys.argv)'] +
                      ['^', '<-- see, it is still here'])

Последняя команда использует subprocess.list2cmdline() который следует правилам синтаксического анализа командной строки C для преобразования списка в командную строку - это не влияет на ^,

^ не специально для CreateProcess() , ^ это особенное, если вы используете shell=True (когда cmd.exe работает).

если и только если полученная командная строка будет интерпретирована cmd, префикс каждого метасимвола оболочки (или каждого символа) с ^ характер Это включает ^ сам.

Другие вопросы по тегам