我想知道是否有办法在python中运行命令行可执行文件,但是从内存中传递参数值,而不必将内存数据写入磁盘上的临时文件。从我所看到的,似乎subprocess.Popen(args)是从python脚本中运行程序的首选方式。
例如,我在内存中有一个pdf文件。我想使用大多数Linux发行版中的命令行函数pdftotext将其转换为文本。但我宁愿不将内存中的pdf文件写入磁盘上的临时文件。
pdfInMemory = myPdfReader.read()
convertedText = subprocess.<method>(['pdftotext', ??]) <- what is the value of ??
我应该调用的方法是什么?如何将内存数据输入到第一个输入并将其输出传输回内存中的另一个变量?
我猜测还有其他pdf模块可以在内存中进行转换,有关这些模块的信息会很有帮助。但是为了将来参考,我也对如何从python内部管道输入和输出到命令行感兴趣。
非常感谢任何帮助。
答案 0 :(得分:2)
import subprocess
out, err = subprocess.Popen(["pdftotext", "-", "-"], stdout=subprocess.PIPE).communicate(pdf_data)
答案 1 :(得分:2)
os.tmpfile
很有用。它使用一个文件,但它几乎和管道方法一样简单,不需要清理。
tf=os.tmpfile()
tf.write(...)
tf.seek(0)
subprocess.Popen( ... , stdin = tf)
这可能不适用于Posix受损的操作系统'Windows'。
答案 2 :(得分:1)
Popen.communicate接受一个用于将数据发送到stdin的输入参数,您可以使用它来输入数据。您还可以从communicate
获取程序的输出,因此您无需将其写入文件。
沟通文档明确警告所有内容都缓存在内存中,这似乎正是您想要实现的目标。