在Python中使用subprocess.popen与os.tmp文件并传递可选参数

0 投票
2 回答
1758 浏览
提问于 2025-04-16 05:15

我正在Linux系统上写一个Python程序,其中有一部分需要运行pdftotext这个程序来把PDF文件转换成文本。下面是我现在使用的代码。

pdfData = currentPDF.read()

tf = os.tmpfile()
tf.write(pdfData)
tf.seek(0)

out, err = subprocess.Popen(["pdftotext", "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()

这个方法运行得很好,但现在我想用-pdftotext的-layout选项(这个选项可以保持文档的布局)。我尝试把“-”替换成layout,把“pdftotext”替换成“pdftotext -layout”等等,但都不行,结果都是空文本。因为输入是通过临时文件传入的,所以我在弄清楚参数列表时遇到了麻烦。大部分关于Popen的文档都假设所有参数都是通过参数列表传递的,但在我的情况下,输入是通过临时文件传递的。

如果有人能帮忙,我将非常感激。

2 个回答

0

你可以把完整的命令作为字符串传递,并且设置参数为shell=True:

out, err = subprocess.Popen('pdftotext -layout - -', shell=True, stdin=tf, stdout=subprocess.PIPE).communicate()
2

这个方法对我有效:

out, err = subprocess.Popen(
    ["pdftotext", '-layout', "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()

虽然我在手册里没有找到明确的确认,但我认为第一个 - 是告诉 pdftotext 要从标准输入(stdin)接收 PDF-file,而第二个 - 则是告诉 pdftotext 要把 text-file 输出到标准输出(stdout)。

撰写回答