Подпроцесс Python игнорирует обратную косую черту в команде convert - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу изменить размер нескольких изображений, используя «convert».

Это прекрасно работает из командной строки.

Однако, когда я пытаюсь добиться того же в Python3 с помощью subprocess.Popen, флаг '\!'указание, что соотношение сторон изображения должно игнорироваться при изменении размера, не работает.

Начиная с 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 голосов
/ 08 февраля 2019

В дополнение к принятому ответу : По сути, проблема заключается в следующем:

Преобразование команды оболочки в команду без оболочки.

Там библиотека , решающая эту задачу.

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

дает

['convert', 'source.png', '-resize', '1230x80!', 'out_console.png']
0 голосов
/ 07 февраля 2019

! необходимо экранировать, потому что вы работаете в оболочке.Но сама команда не понимает \, и Popen не использует оболочку (если вы не используете shell=True, но избегаете, как чума)

Так что вы просто переусердствовали.

Вместо этого передайте аргументы без кавычек или экранирования:

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

теперь у вас есть переносимая командная строка, которая будет работать даже в Windows (ну, в Windows есть команда convert, которая нене делайте то же самое, поэтому вам нужно будет указать полный путь к команде convert)

...