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']
我想使用 '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']