在子进程中向'pstops'指定参数。Popen

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

从命令行发出此命令:

pdftops -paper A4 -nocenter opf.pdf - | pstops "1:[email protected](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:[email protected](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

(原文如此。我怀疑0x23f2dd0以某种方式取代了“ P”。无论如何,我怀疑问题出在页面规格1:[email protected](0.5cm,13.5cm)中,因此我尝试使用/不使用单引号以及(转义)双引号。我什至尝试了shlex.quote,它产生了非常奇特的''"'"'1:[email protected](0.5cm,13.5cm)'"'"'',但仍然是相同的错误。

是什么原因造成的?

EDIT作为最后的资源,我尝试过:

    os.system(("pdftops -paper A4 -nocenter {} - | "
               "pstops '1:[email protected](1cm,13.5cm)' | "
               "lpr").format(path))

效果很好。不过,我还是更喜欢上面的Popen解决方案。

python linux subprocess popen
1个回答
0
投票

考虑一下外壳如何使用该参数(或使用printf '%s\n'之类的东西来显示给您)。我们需要撤消shell引用,并用Python引用替换它(恰好非常相似):

pr = sp.Popen(
            ["pstops",
             "1:[email protected](0.5cm,13.5cm)"],
            stdin = ps.stdout,
            stdout = sp.PIPE)
© www.soinside.com 2019 - 2024. All rights reserved.