我准备了一些代码来执行这样的命令行:
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"
这从命令行工作正常(同上面的命令),但352×352 ^是352×352 ^不是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"
如果从python运行这个代码 – 字符'^'被忽略,resize的图像的大小为'%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()
为什么Python会削减“^”字符以及如何避免?
Python不会剪切^
字符。 Popen()
将字符串( resize_command
Popen()
传递给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()
,它遵循Parsing C Command-Line Arguments规则将列表转换为命令字符串 – 它对^
没有影响。
^
对于CreateProcess()
不是特别的。 如果你使用shell=True
(当cmd.exe
运行时) ^
是特殊的 。
当且仅当生成的命令行将被cmd解释时,用^
字符作为每个shell元字符(或每个字符)的前缀 。 它包括^
本身。