Почему символ "^" игнорируется 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 сокращает символ "^" и как его избежать?
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()
, которая следует за Правилами аргументов командной строки P, чтобы преобразовать список в командную строку. не влияет на ^
.
^
не является особенным для CreateProcess()
. ^
является специальным, если вы используете shell=True
(когда выполняется cmd.exe
).
тогда и только тогда, когда созданная командная строка будет интерпретироваться cmd, префикс каждого метасимвола оболочки (или каждого символа) с помощью ^
символ. Он включает в себя ^
.