在 os.system 调用中字符串插值失败

问题描述 投票:0回答:2

编辑跳到答案:问题是我插入的字符串中有一个肉眼看不见的非 ascii 字符。

我正在尝试运行这个 ImageMagick 命令:

convert -verbose -size 732x142 xc:transparent -fill black -stroke black -strokewidth 2 -draw "roundrectangle 0,0 732,142 18,18" "Sample Card Title.png"

如果我直接从命令行运行它,它运行没有错误。

只有我试图在 Python 脚本中运行它,其中大部分值都是由脚本生成的。当我从那里启动它时,具有相同的值,ImageMagick 错误,报告:

convert: non-conforming drawing primitive definition `roundrectangle' @ error/draw.c/RenderMVGContent/4506.

当它运行时:

  rectangle_coordinates = f"\"roundrectangle 0,0 {mm_to_px(62)},{mm_to_px(box_height)} {mm_to_px(1.5)},{mm_to_px(1.5)}\""
  command = f"convert -verbose -size {dimensions} xc:transparent -fill black -stroke black -strokewidth 2 -draw {rectangle_coordinates} \"{filename}\""
  print(command)
  os.system(command)

如果我删除变量“rectangle_coordinates”并用硬编码替换它,那么它就可以工作了:

command = f"convert -size {dimensions} xc:transparent -fill black -stroke black -strokewidth 2 -draw \"roundrectangle 0,0 732,142 18,18\" \"{filename}\""
print(command)
os.system(command)

如果我从字面上复制粘贴 print(command) 行的结果从输出到提示并运行它,它运行时没有错误。但是当使用 os.system 运行时,它调用的命令出错。

任何人都明白为什么命令会因插入那一部分而失败,但在硬编码时运行良好?

附言是的,我知道 subprocess.run() 优于 os.system()。在调试过程中,我已经尝试了这个命令的这么多变化,将参数分成一个列表,用于我尝试的每一个不同的东西只是添加了一个(人为)错误的来源。我在寻找 bug 时回到了 os.system。一旦我解决了这个错误,我会很乐意回到 subprocess.run()。

运行脚本调用...

subprocess.run(["convert", "-size", dimensions, "xc:transparent", "-fill", "black", "-stroke", "black", "-strokewidth", "2", "-draw", rectangle_coordinates, "\"{resisted_consequence_filename}\""])

...产生与 os.system 版本相同(或更多)的错误。

P.P.S.是的,我也知道有多个用于 Python 的 ImageMagick 包装器。我宁愿不添加额外的抽象层,尤其是在寻找错误时。

python subprocess imagemagick string-interpolation os.system
2个回答
0
投票

subprocess.call()
参数中,您不应在最后一个参数中添加文字引号。在 shell 中只需要引用来将多个单词组合成一个单词,但这已经通过将它们分开的列表元素来完成。

subprocess.run(["convert", "-size", dimensions, "xc:transparent", "-fill", "black", "-stroke", "black", "-strokewidth", "2", "-draw", rectangle_coordinates, resisted_consequence_filename])

0
投票

我找到了答案。我不得不离开几天然后回来。

事实上,您在 Stack Overflow 上看不到它,原因与我难以追踪它的原因相同:

在插入之前,我的代码在问题变量的定义中有一个不间断的空格。

即行中:

rectangle_coordinates = f"\"roundrectangle 0,0 {mm_to_px(62)},{mm_to_px(box_height)} {mm_to_px(1.5)},{mm_to_px(1.5)}\""

最后的空格不是普通空格,ascii码0x20。 这是一个 unicode 不间断空格,代码点 C2A0。

你在 Stack Overflow 上根本看不到这里的错误,因为与打印到终端一样,当我将它复制粘贴到这里时,它也被转换为标准空间。如果我真的把我在这里发布的示例代码复制到我的原始代码中,它就会覆盖错误。

10 Headdesk
20 Goto 10

我最终在绝望中找到了错误,我想,“如果我将命令写入文件,然后从文件中读回怎么办?那肯定会消化字符串插值,迫使它解析与我硬编码时相同的行它。”当我第一次硬编码一个示例文本文件时,当然是有效的。但是当我让程序写入文本文件并读回时,它又失败了。但是现在我有了我的硬编码版本和程序编写的版本,它们肉眼看起来是一样的,但不同的是不同。所以我在十六进制编辑器中打开它们,结果是:一个字符不同,即使它们在屏幕上打印相同。

© www.soinside.com 2019 - 2024. All rights reserved.