【问题标题】:Send args to subprocess while using stdin使用标准输入时将 args 发送到子进程
【发布时间】:2012-12-29 19:39:24
【问题描述】:

我正在尝试截取屏幕截图,然后在该屏幕截图上运行命令而不保存到磁盘。

我要运行的实际命令是visgrep image.png pattern.pat

visgrep 必须有两个参数:图像文件和 .pat 文件。

这是我目前所拥有的。

p = subprocess.Popen(['import', '-crop', '305x42+1328+281', '-window', 'root', '-depth', '8', 'png:' ], stdout=subprocess.PIPE,)
cmd = ['visgrep']
subprocess.call(cmd, stdin=p.stdout)

显然这会失败,因为 visgrep 必须有两个参数。

那么我该怎么做visgrep image.png pattern.pat,但用 ImageMagick 的import 的输出替换“image.png”?

我需要使用 xargs 吗?有没有更好的方法来完成我正在尝试的事情?

【问题讨论】:

    标签: python subprocess pipe stdin io-redirection


    【解决方案1】:

    来自ImageMagick documentation

    STDIN、STDOUT 和文件描述符

    Unix 和 Windows 允许将一个命令的输出通过管道传送到 另一个的输入。 ImageMagick 允许读取图像数据并 从标准流 STDIN(标准输入)和 STDOUT 编写 (标准输出),分别使用伪文件名 -.在这 例如,我们将 convert 的输出通过管道传输到显示程序:

    $ convert logo: gif:- | display gif:-

    第二种显式格式“gif:”在前面是可选的 例子。 GIF 图像格式在图像中具有唯一的签名 因此 ImageMagick 的显示命令可以很容易地将格式识别为 动图。转换程序也以这种方式接受 STDIN 作为输入:

    $convert rose: gif:- | convert - -resize "200%" bigrose.jpg

    您可以使用与import 命令相同的文件名约定。

    那么,试试吧:

    p = subprocess.Popen(['import', '-crop', '305x42+1328+281', 
                          '-window', 'root', '-depth', '8', 'png:-' ], 
                          stdout=subprocess.PIPE,)
    

    【讨论】:

      【解决方案2】:

      根据this answer,将参数png: 更改为png:- 将导致导入命令输出到标准输出而不是文件。我对 visgrep 不熟悉,所以我不确定如何告诉它从标准输入读取源图像。

      【讨论】:

        【解决方案3】:

        在 linux 中,您可以使用 /dev/stdin 作为文件名,但它并不总是有效。如果它不适用于visgrep,则必须使用临时文件(这并不可惜)。

        PS。 png: 不应该是 png:- 吗?

        【讨论】:

        • 谢谢! /dev/stdin 有效。是的,它是 png:- 但我无缘无故地删除了 - 并且没有明显的区别,所以忘了重新添加它。
        • @JayS:有时仅仅- 也可以:import .. | visgrep - pat
        猜你喜欢
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多