为什么角色' ^'被Python Popen忽略 - 如何逃避' ^' Popen Windows中的角色?

时间:2015-01-09 15:40:26

标签: python windows python-2.7 imagemagick subprocess

我准备了一些代码来执行这样的命令行:

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 个答案:

答案 0 :(得分:3)

  

为什么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'])

后一个命令使用遵循Parsing C Command-Line Arguments规则的subprocess.list2cmdline()将列表转换为命令字符串 - 它对^没有影响。

^ is not special for CreateProcess(). ^ is special if you use shell=True (when cmd.exe is run)

if and only if the command line produced will be interpreted by cmd, prefix each shell metacharacter (or each character) with a ^ character。它包括^本身。