【问题标题】:Python - integers as input piped to subprocess.PopenPython - 整数作为输入管道传输到 subprocess.Popen
【发布时间】:2017-07-11 06:31:27
【问题描述】:

我有一个包含整数的列表,并希望将其定向到一个 shell 命令,该命令从中创建一个直方图(请参阅here)。

现在,让我们通过一个简单的 shell 脚本echo_script.sh 来模拟直方图生成脚本,它会回显所有输入:

#/bin/sh
echo $@

在 Python 中,我想将列表的内容定向到该命令。我想这涉及到对subprocess 的一些摆弄。

numbers = [1, 2, 3]
# subprocess stuff, writing numbers to stdin of echo_script.sh process?

我想将以下输出输出到标准输出:

1 2 3

请注意,我知道涉及将列表内容存储在临时文件中并将该文件传送到 echo_script.sh 的解决方案。我想避免这种情况。

编辑:我正在使用的 histogram.py 脚本不支持读取任意数量的附加参数,就像echo 1 2 3 那样。它仅从stdin 读取。因此,上面的示例具有误导性。我尝试过的一种方法:

proc = subprocess.Popen(["wc", "-l"], stdin=subprocess.PIPE)
proc.stdin.write(bytes([42]))

这会输出 1,这是正确的行数,但实际上是写入的字节数。所以我还有两个问题:

  • 如何正确使用字节数组发送到proc.stdin.write
  • 如何将 proc 的 stdout 重定向到当前进程?

【问题讨论】:

    标签: python subprocess pipe


    【解决方案1】:

    这样的?

    import subprocess
    
    path_to_script = "./echo_script.sh"
    numbers = [1, 2 ,3]
    numbers_str = ' '.join(str(i) for i in numbers) # should give you '1 2 3'
    
    subprocess.call([path_to_script, numbers_str])
    

    编辑您的编辑:

    我认为您可能需要使用 subprocess.Popen 。这可能有效:

    import subprocess
    
    script = "/path/to/script.py"
    
    numbers = [1, 2 ,3]
    numbers_str = ' '.join(str(i) for i in numbers) + '\n' # should give you '1 2 3'
    
    proc = subprocess.Popen(script, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    proc.stdin.write(numbers_str)
    proc.stdin.close()
    print(proc.stdout.read())
    

    【讨论】:

    • 这种方法对于echo 示例很有用。但是,它不适用于给定的脚本。我已经编辑了我的问题。谢谢你的帮助!如果你再看看我会很高兴。
    • 您的编辑让我走上了正轨,谢谢!我应用了一些修改:我使用换行符加入了数字。 proc.std.write() 需要一个字节对象,所以我通过bytearray(numbers_str, 'utf-8') 转换numbers_strread 的输出也是如此,所以我放了一个 .decode()
    【解决方案2】:

    这是你想要完成的吗?

    import subprocess
    l = [1, 2, 3]
    l = ' '.join(str(x) for x in l)
    subprocess.call(["./echo_script.sh {}".format(l)], shell=True)
    

    【讨论】:

    • 如果每行有一个数字,则将 ' '.join(str(x) for x in l) 更改为 '\n'.join(str(x) for x in l) 应该可以。
    • 这种方法对于 echo 示例很有用。但是,它不适用于给定的脚本。我已经编辑了我的问题,很抱歉造成误解。谢谢你的帮助!如果你再看看我会很高兴。
    猜你喜欢
    • 2011-01-20
    • 2013-12-17
    • 1970-01-01
    • 2010-12-16
    • 2011-04-28
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多