【问题标题】:Running a command line from python and piping arguments from memory从 python 运行命令行并从内存中传递参数
【发布时间】:2010-09-19 22:16:27
【问题描述】:

我想知道是否有一种方法可以在 python 中运行命令行可执行文件,但将参数值从内存传递给它,而无需将内存数据写入磁盘上的临时文件。从我所见,似乎 subprocess.Popen(args) 是从 python 脚本中运行程序的首选方式。

例如,我在内存中有一个 pdf 文件。我想使用大多数 linux 发行版中存在的命令行函数 pdftotext 将其转换为文本。但我不希望将内存中的 pdf 文件写入磁盘上的临时文件。

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

我应该调用什么方法,我应该如何将内存数据通过管道传输到其第一个输入并将其输出传输回内存中的另一个变量?

我猜还有其他 pdf 模块可以在内存中进行转换,有关这些模块的信息会有所帮助。但为了将来参考,我也对如何从 python 内部将输入和输出通过管道传输到命令行感兴趣。

任何帮助将不胜感激。

【问题讨论】:

    标签: python linux


    【解决方案1】:

    Popen.communicate:

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

    【讨论】:

    • 另一个不直接相关的问题是将内存变量转换为“可搜索流”。因为现在我收到一条错误消息“错误:文档基础流不可搜索”。我想有一些方法/模块可以传递 pdf_data 以使其成为可搜索的流?
    • @Chaitanya。这是一个已解决的 pdftotext 回归错误:bugs.freedesktop.org/show_bug.cgi?id=7334,更新您的 poppler 包。顺便说一句,在这种情况下,您无法构建“可搜索流”,输出被写入处理文件描述符,Python 无能为力。
    • 因此它抱怨 pdftotext 的输出不可搜索,而不是输入数据文件。 Fedora 12 的软件更新程序似乎没有更新它,执行 'su -c 'yum update poppler' 也没有。我已经从这里下载并压缩了 0.14 版本,poppler.freedesktop.org 但似乎无法安装它(make 和 make install 失败)
    • 很抱歉继续回到这个问题,但是如何使用 POpen 传递可选参数。我正在使用下面 greggo 建议的临时文件。我想通过运行“pdftotext -layout”来保留布局。我尝试将 Popen 中的“-”替换为“-layout”,将“pdftotext”替换为“pdftotext -layout”并将其传递给通信等。这些都不起作用。我只是得到一个空文本。
    【解决方案2】:

    os.tmpfile 在您需要可搜索的东西时很有用。它使用文件,但它几乎与管道方法一样简单,无需清理。

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

    这可能不适用于 Posix 受损的操作系统“Windows”。

    【讨论】:

    • 这也有效。为了为未来的用户扩展,我上面的第 4 行是“out, err = subprocess.Popen(["pdftotext", "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()" .在此之后,变量“out”包含文本格式的 pdf。
    【解决方案3】:

    Popen.communicate from subprocess 接受一个输入参数,用于将数据发送到标准输入,您可以使用它来输入您的数据。您还可以从communicate 获得程序的输出,因此您不必将其写入文件。

    communication 的文档明确警告说,所有内容都缓存在内存中,这似乎正是您想要实现的目标。

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 2011-12-13
      • 2017-08-17
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多