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

时间:2019-02-07 19:59:42

标签: python python-3.x subprocess imagemagick-convert

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

这在命令行中效果很好。

但是,当我尝试使用subprocess.Popen在Python3中实现相同功能时,标志为'\!'指定在调整大小时应忽略图像的宽高比,这是行不通的。

source 我想要 source 并不是 source

在命令行中,使用以下命令可以正常工作

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

结果未调整大小:

source

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

2 个答案:

答案 0 :(得分:1)

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

所以你只是在做这个。

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

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

现在您有了一个可移植的命令行,该命令行甚至可以在Windows上使用(嗯,在Windows上有一个convert命令,它根本不会执行相同的操作,因此您必须指定该命令的完整路径convert命令)

答案 1 :(得分:0)

除了accepted answer: 问题本质上是:

将Shell命令转换为非Shell命令。

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

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

给予

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