Python - 整数作为输入通过管道传递给subprocess.Popen

时间:2017-02-21 14:53:05

标签: python subprocess pipe

我有一个包含整数的列表,并希望将它指向一个从它创建直方图的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?

我希望将以下输出发送到stdout:

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重定向到当前进程?

2 个答案:

答案 0 :(得分:0)

这是你想要完成的吗?

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

答案 1 :(得分:-2)

这样的东西?

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())