从Python运行命令行并从内存传递参数

4 投票
3 回答
2530 浏览
提问于 2025-04-16 04:20

我在想有没有办法在Python中运行一个命令行程序,并且直接从内存中传递参数值,而不是把内存中的数据写到临时文件里。从我看到的情况来看,subprocess.Popen(args)似乎是从Python脚本中运行程序的推荐方法。

举个例子,我有一个在内存中的pdf文件。我想用命令行工具pdftotext把它转换成文本,这个工具在大多数Linux系统中都有。但我更希望不把这个内存中的pdf文件写到磁盘上的临时文件里。

pdfInMemory = myPdfReader.read()
convertedText = subprocess.<method>(['pdftotext', ??]) <- what is the value of ??

我应该调用什么方法,如何把内存中的数据作为输入传递给它,并把输出再传回到另一个内存变量中呢?

我猜还有其他的pdf模块可以在内存中完成转换,关于这些模块的信息会很有帮助。不过为了将来参考,我也想知道如何在Python中把输入和输出传递给命令行。

任何帮助都将非常感谢。

3 个回答

1

Popen.communicate 是 subprocess 模块中的一个功能,它有一个输入参数,可以用来把数据发送到程序的标准输入(stdin)。你可以利用这个功能来输入你的数据。同时,你也可以通过 communicate 获取你程序的输出,这样就不需要把输出写入文件了。

文档中明确警告说,所有的数据都是存储在内存中的,这似乎正是你想要的效果。

2

os.tmpfile 是一个很有用的工具,特别是当你需要一个可以随意读取和写入的文件时。它会创建一个临时文件,使用起来几乎和管道一样简单,而且用完后不需要特别清理。

tf=os.tmpfile()
tf.write(...)
tf.seek(0)
subprocess.Popen(  ...    , stdin = tf)

不过,这个在某些操作系统上可能不太好用,比如“Windows”。

2

使用 Popen.communicate 方法:

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

撰写回答