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


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

c:cygwinbinconvert "c:rootdropboxwwwtiffphotosarchitecturecalendar-bwl-projektbwl01.tif" -thumbnail 352x352^ -format jpg -filter Catrom -unsharp 0x1 "c:rootdropboxwwwtiffthumbnailsarchitecturecalendar-bwl-projektthumbnailbwl01.jpg"

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

c:cygwinbinconvert "c:rootdropboxwwwtiffphotosarchitecturecalendar-bwl-projektbwl01.tif" -thumbnail 352x352^ -format jpg -filter Catrom -unsharp 0x1 "c:rootdropboxwwwtiffthumbnailsarchitecturecalendar-bwl-projektthumbnailbwl01.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 2

1 ответ:

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

Python не вырезает ^ символ. Popen() передает строку (resize_command) в CreateProcess() вызов API Windows как есть.

Легко проверить:

#!/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, префикс каждого метасимвола оболочки (или каждого символа) с символом ^ . Она включает в себя ^ саму себя.