2017-02-21 57 views
0

我有一个包含整数的列表,并且希望将其引导至一个shell命令,该命令可以根据它创建直方图(请参阅here)。Python - 输入为输入到子进程的整数.Popen

现在,让我们通过一个简单的shell脚本echo_script.sh呼应所有输入模拟天生柱状图生成脚本:

#/bin/sh 
echo [email protected] 

从内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

这样的事情?

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

这种方法对'echo'示例很有用。但是,它不适用于给定的脚本。我编辑了我的问题。谢谢你的帮助!如果你再看一眼,我会很开心。 – pylipp

+0

您的编辑让我走上正轨,谢谢!我应用了一些修改:我使用换行符加入了数字。 'proc.std.write()'需要一个字节对象,所以我通过'bytearray(numbers_str,'utf-8')''转换'numbers_str'。 'read'的输出也一样,所以我放了一个'.decode()'。 – pylipp

0

这是你想要完成的吗?

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

如果它的每行数,然后改变'''.join(str(x)for x in l)'''\ n'.join(str(x)for x in l)'应该工作。 – AJPennster

+0

这种方法对于echo示例很有用。但是,它不适用于给定的脚本。我编辑了我的问题,对于误会感到抱歉。谢谢你的帮助!如果你再看一眼,我会很开心。 – pylipp

相关问题