Проблема с указанием параметров для pstops в подпроцессе. Открыть - PullRequest
0 голосов
/ 22 января 2020

Выполнение этой команды из командной строки:

pdftops -paper A4 -nocenter opf.pdf - | pstops "1:0@0.8(0.5cm,13.5cm)" > test.ps

работает нормально. Я попытался преобразовать это в список параметров для subprocess.Popen следующим образом:

import subprocess as sp

path = 'opf.pdf'

ps = sp.Popen(
            ["pdftops",
             "-paper", "A4",
             "-nocenter",
             "{}".format(path),
             "-"],
            stdout = sp.PIPE)
pr = sp.Popen(
            ["pstops",
             "'1:0@0.8(0.5cm,13.5cm)'"],
            stdin = ps.stdout,
            stdout = sp.PIPE)
sp.Popen(
            ["lpr"],
            stdin = pr.stdout )

, где path - это имя файла - opf.pdf. Это приводит к ошибке во втором Popen:

0x23f2dd0age specification error:
  pagespecs = [modulo:]spec
  spec      = [-]pageno[@scale][L|R|U|H|V][(xoff,yoff)][,spec|+spec]
                modulo >= 1, 0 <= pageno < modulo

(si c). Я подозреваю, что 0x23f2dd0 каким-то образом заменил 'P'. В любом случае, я подозреваю, что проблема в странице spe c 1:0@0.8 (0,5 см, 13,5 см), поэтому я попытался использовать одинарные кавычки или без них, а также двойные кавычки (экранированные). Я даже попытался shlex.quote, который выдал очень экзотический c ''"'"'1:0@0.8(0.5cm,13.5cm)'"'"'', но все еще та же ошибка.

Что вызывает это?

РЕДАКТИРОВАТЬ Как Последний ресурс, который я пробовал:

    os.system(("pdftops -paper A4 -nocenter {} - | "
               "pstops '1:0@0.8(1cm,13.5cm)' | "
               "lpr").format(path))

, который работает отлично. Я все же предпочел бы вышеуказанное решение Popen.

1 Ответ

1 голос
/ 22 января 2020

Подумайте, что оболочка делает с этим аргументом (или используйте что-то вроде printf '%s\n', чтобы показать это вам). Нам нужно отменить цитирование оболочки и заменить его на Python цитирование (что очень жутко похоже):

pr = sp.Popen(
            ["pstops",
             "1:0@0.8(0.5cm,13.5cm)"],
            stdin = ps.stdout,
            stdout = sp.PIPE)
...