为什么字符'^'被忽略byt 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" 

这从命令行工作正常(同上面的命令),但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元字符(或每个字符)的前缀 。 它包括^本身。