Python的子进程忽略反斜线convert命令

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

我想调整使用“转换”多张图片。

此命令行的伟大工程。

然而,当我尝试使用subprocess.Popen,标志实现了从内Python中相同的“\!”指定该图像的纵横比应该在大小调整期间被忽略,不工作。

从开始我想,而不是

在命令行中使用此工作正常

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\\!'没有成功反斜杠字符。

python python-3.x subprocess imagemagick-convert
2个回答
1
投票

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

所以你只是矫枉过正这一点。

相反,传递参数没有引用或转义:

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

现在你有一个可移植的命令行,即使是将工作在Windows上(当然,在Windows上有一个convert命令,它不会做同样的事情,在所有所以你必须指定convert命令的完整路径)


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']
© www.soinside.com 2019 - 2024. All rights reserved.