从命令行发出此命令:
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
解决方案。
考虑一下外壳如何使用该参数(或使用printf '%s\n'
之类的东西来显示给您)。我们需要撤消shell引用,并用Python引用替换它(恰好非常相似):
pr = sp.Popen(
["pstops",
"1:[email protected](0.5cm,13.5cm)"],
stdin = ps.stdout,
stdout = sp.PIPE)