cupsfilter 不适用于 Python subprocess.call()
cupsfilter Does Not Work With Python subprocess.call()
阅读 this question 后,我一直在试验并在 Python 中使用 subprocess.call() 到 运行 一个命令,就像来自终端一样。我发现它工作得很好,我更喜欢它而不是 os.system。不过,我 运行 遇到了 cupsfilter 的问题。我正在尝试 运行 在 OS X 上执行此命令,来自 Python:
cupsfilter -o cpi=10 PDFTestIn.txt 2>PDFTestError.txt >PDFTestOut.pdf
(我尝试过,最初,有多个选项,但在我可以让它工作之前,我将它限制为一个选项。)
我可以 运行 从命令行和 os.system 命令正常,但我在 subprocess.call() 中使用此命令时遇到问题。我一直在 IDLE 中进行试验,但 cupsfilter 不能像其他程序那样使用它。如果我以以下形式提供选项:
-o optionname=optionvalue
我总是收到错误消息。我试过这个:
import subprocess
import os
cmd = '/usr/sbin/cupsfilter'
args = ['-o cpi=10']
ifile='PDFTestIn.txt'
ofile='PDFTestOut.pdf'
efile='PDFTestError.txt'
cmdargs = [cmd] + args + [ifile]
with open(ofile, 'w') as pdfout, open(efile, 'w') as errout:
subprocess.call(cmdargs, stdout=pdfout, stderr=errout)
当我这样做时,我从最后一个命令中得到一个 return 值 1。我检查 PDFTestError.txt 的输出,它显示为:
cupsfilter: Unknown option " ".
我尝试将第 4 行更改为:
args = ['-ocpi=10']
我得到这个错误:
cupsfilter: Unknown option "c".
“-o”之后的任何字符都被视为一个选项,并且只有一个字母被确认,而不是单词(如 "cpi")。尽管除了“-o”之外我还可以使用其他选项,但我想我会尝试不使用“-o”以防万一。当我这样做时,出现此错误:
cupsfilter: Only one filename can be specified.
(如果我只使用命令作为传递给 subprocess.call() 的列表中的参数,并且仍然指定 stdout 和 stderr,它工作正常。)
总结:当我使用“-o”为 cupsfilter 提供选项时,在 subprocess.call() 中,cupsfilter 只查看下一个字符,而不查看下一个单词。如果我在“-o”之后有一个 space 就像我在命令行上那样,它期望 space 是一个选项。如果我将 space 排除在外,它会查看下一个字符而不是下一个单词。如果我省略“-o”,它会将选项视为另一个文件名(如我所料)。
但是如果我从终端或 os.system() 使用上面的命令行,则完全没有问题。
为什么这不能与 subprocess.call() 一起使用,有没有办法纠正它?
您需要将每个参数分开,'-o cpi=10' -> '-o', 'cpi=10'
:
subprocess.call([cmd,'-o','cpi=10',infile], stdout=pdfout, stderr=errout)
阅读 this question 后,我一直在试验并在 Python 中使用 subprocess.call() 到 运行 一个命令,就像来自终端一样。我发现它工作得很好,我更喜欢它而不是 os.system。不过,我 运行 遇到了 cupsfilter 的问题。我正在尝试 运行 在 OS X 上执行此命令,来自 Python:
cupsfilter -o cpi=10 PDFTestIn.txt 2>PDFTestError.txt >PDFTestOut.pdf
(我尝试过,最初,有多个选项,但在我可以让它工作之前,我将它限制为一个选项。)
我可以 运行 从命令行和 os.system 命令正常,但我在 subprocess.call() 中使用此命令时遇到问题。我一直在 IDLE 中进行试验,但 cupsfilter 不能像其他程序那样使用它。如果我以以下形式提供选项:
-o optionname=optionvalue
我总是收到错误消息。我试过这个:
import subprocess
import os
cmd = '/usr/sbin/cupsfilter'
args = ['-o cpi=10']
ifile='PDFTestIn.txt'
ofile='PDFTestOut.pdf'
efile='PDFTestError.txt'
cmdargs = [cmd] + args + [ifile]
with open(ofile, 'w') as pdfout, open(efile, 'w') as errout:
subprocess.call(cmdargs, stdout=pdfout, stderr=errout)
当我这样做时,我从最后一个命令中得到一个 return 值 1。我检查 PDFTestError.txt 的输出,它显示为:
cupsfilter: Unknown option " ".
我尝试将第 4 行更改为:
args = ['-ocpi=10']
我得到这个错误:
cupsfilter: Unknown option "c".
“-o”之后的任何字符都被视为一个选项,并且只有一个字母被确认,而不是单词(如 "cpi")。尽管除了“-o”之外我还可以使用其他选项,但我想我会尝试不使用“-o”以防万一。当我这样做时,出现此错误:
cupsfilter: Only one filename can be specified.
(如果我只使用命令作为传递给 subprocess.call() 的列表中的参数,并且仍然指定 stdout 和 stderr,它工作正常。)
总结:当我使用“-o”为 cupsfilter 提供选项时,在 subprocess.call() 中,cupsfilter 只查看下一个字符,而不查看下一个单词。如果我在“-o”之后有一个 space 就像我在命令行上那样,它期望 space 是一个选项。如果我将 space 排除在外,它会查看下一个字符而不是下一个单词。如果我省略“-o”,它会将选项视为另一个文件名(如我所料)。
但是如果我从终端或 os.system() 使用上面的命令行,则完全没有问题。
为什么这不能与 subprocess.call() 一起使用,有没有办法纠正它?
您需要将每个参数分开,'-o cpi=10' -> '-o', 'cpi=10'
:
subprocess.call([cmd,'-o','cpi=10',infile], stdout=pdfout, stderr=errout)