当前位置: 首页 > 面试题库 >

为什么字符'^'会被Python Popen忽略-如何在Popen Windows中转义'^'字符?

夏晋
2023-03-14
问题内容

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

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()

问题答案:

为什么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()遵循“解析C命令行参数”规则将列表转换为命令字符串的方式-对无效^

^并不是特别的CreateProcess()^如果使用shell=Truecmd.exe运行时)是特殊的。

当且仅当
产生的命令行将由cmd解释时,才在每个shell元字符(或每个字符)前加上一个^字符
。它包括^自身。



 类似资料:
  • 问题内容: 如何在javadoc中转义符号?我正在尝试在标签内使用它。 我已经尝试了html转义序列,但是没有用。 问题答案: 使用javadoc标记: 为此的javadoc将显示为: 当然,这适用于 任何 字符,并且是显示任何“特殊”字符的“官方支持”方式。 这也是最简单明了-你不需要知道字符的十六进制代码, 并且 可以读取你输入什么!

  • 本文向大家介绍PowerShell中的转义字符是什么?,包括了PowerShell中的转义字符是什么?的使用技巧和注意事项,需要的朋友参考一下 PowerShell中转义字符是`,向后撇号(backward apostrophe,是tab键上面的按键,不是单引号),例如: 会输出$env:processor_architecture=AMD64 当然还有一个转义字符是在正则表达式(Regular

  • 问题内容: 请说明执行以下代码部分时究竟发生了什么: 这打印出13; 打印出21; 打印出64。 问题答案: 您已为字符变量分配了一个变量,该字符变量由单引号引起来,例如(不同于与字符串文本由双引号引起来的,例如)。Java会自动将16位无符号转换为32位带符号。 但是,当字符文字是反斜杠后跟1-3个数字时,它是字符的 八进制 (基数/基数 8)表示。从而: = 1×8 + 5 = 13(回车;与

  • 问题内容: 如果我有一个字符串变量: 我想在每一个前面加一个转义字符和 变量中 (即 未 竟逃脱字符),我该怎么做? 问题答案: 我不是在这里要求优雅,但我 认为 它可以满足您的要求(如果我误会了,请纠正我): 输出

  • 问题内容: 我正在读取Java中的源文件,但是当我打印它(sysout)时,转义的字符不再转义。如何在Java中转义像和这样的字符? 问题答案: 您应该使用Apache Commons Text中的类(您也可以在Apache Commons Lang3中找到该类,但已弃用该类)。您会发现Apache Commons中还有许多其他产品可能对您在Java开发中遇到的其他问题有用,因此您不必重新发明轮子

  • 问题内容: 手动创建JSON数据时,应如何转义字符串字段?我应该用什么样的Apache Commons Lang中的,或者我应该使用? 问题是,当我使用时,它不会转义引号,并且当我将整个字符串包装在一对s中时,将生成格式错误的JSON。 问题答案: 理想情况下, 找到一种使用您的语言的JSON库 ,您可以向该 库 提供一些适当的数据结构, 并使它担心如何转义 。它会让您保持头脑清醒。如果出于某种原