Python 子进程忽略转换命令中的反斜杠

Python subprocess ignores backslash in convert command

我想使用 'convert' 调整多张图片的大小。

这在命令行中非常有效。

但是,当我尝试使用 subprocess.Popen 在 Python3 中实现相同的目的时,标志“\!”指定在调整大小时应忽略图像的纵横比不起作用。

我想 并不是

从命令行使用

可以正常工作
convert source.png -resize 1230x80\! out_console.png

如果我 运行 从 Python3 中使用

这个命令
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from subprocess import Popen

cmd = [
    'convert',
    'source.png',
    '-resize',
    r'1230x80\!',       # Use '\!' ignoring the aspect ratio
    'out_subprocess.png',
    ]
proc = Popen(cmd)
proc.communicate()

结果未调整大小:

我尝试使用 r'1230x80\!''1230x80\!' 转义反斜杠字符,但没有成功。

! 需要转义,因为您在 shell 中 运行。但是命令本身不理解\,并且Popen不使用shell(除非你使用shell=True,但要避免像瘟疫一样)

所以你做得太过头了。

相反,传递参数时不加引号或转义:

cmd = [
    'convert',
    'source.png',
    '-resize',
    '1230x80!',
    'out_subprocess.png',
    ]

现在你有了一个可移植的命令行,它甚至可以在 Windows 上工作(好吧,在 windows 上有一个 convert 命令,它根本不做同样的事情所以您必须指定 convert 命令的完整路径)

除了: 问题本质上是:

将 shell 命令翻译成非 shell 命令。

有一个 library 解决了这个任务。

import shlex
shlex.split('convert source.png -resize 1230x80\! out_console.png')

给予

['convert', 'source.png', '-resize', '1230x80!', 'out_console.png']