2015-09-20 48 views
0

一些序言: (不知道这是否相关,但我在Windows中的Cygwin中完成了这一切)。 我使用一个用命令行选项(-R0/10 -I0.5 -Sc)调用的程序(prog1)。 prog1的输入是一个(x,y)点列表。这些点可以在一个文件中(我们称之为:points.txt),它可以在命令行中指定,或者像我通常那样通过管道从一个原始数据文件的某些文本格式化命令(例如。awk) raw.txt)。通过python子进程管道输入数据

因此,典型的应用将是(指定文本文件):

prog1 points.txt -R0/10 -I0.5 -Sc 

或(前处理的原始数据文件和管道的话):

awk raw.txt '{print $1, $5}' | prog1 -R0/10 -I0.5 -Sc

现在我想通过子进程从python内部完成以上两项,但遇到困难。我可以在python中进行预处理而不是使用awk函数。

我设法与实现第一种情况(在命令行中指定的文件名):

args = 'greenspline -R0/10 -I0.5 -Sc points.txt'.split() 
p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
print (p.communicate()[0]) 

我也可以管这个文件:

args1 = 'echo points.txt'.split() 
echo = subprocess.Popen(args1, stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
args2 = 'greenspline -R0/10 -I0.5 -Sc 1D.txt'.split() 
p = subprocess.Popen(args2, stdout=subprocess.PIPE, stdin=echo.stdin) 
print ("4b ",p.communicate()[0]) 

但我不能弄清楚如何告诉python如何管理数据。

说我有形式我的数据:

points = [[x1, y1], [x2,y2], [x3,y3],...] 
  • 什么方式来管这(在前面的例子中发生的“回声”)?

其次,简单的问题:

如果,如果有我的两个列表(x)和(y)的数据,有一个简单的,蟒蛇的方法来创建我需要点名单?

我知道我可以使用:

for i in range(len(x)): points.append([x[i],y[i]]) 

但有一个更简单的方法?

正如你可能可以收集我的编程知识水平低,所以你可以请温柔 - 并解释所有答案的俗语!

+1

参见'拉链(x,y)'来创建基于两个独立列表的元组列表。 –

+1

我认为你的代码应该读取'p = subprocess.Popen(args2,stdout = subprocess.PIPE,stdin = echo.stdout)' –

+0

FWIW,shell'echo'命令(在大多数shell中)只是打印它的参数(s)到标准输出,所以'echo points.txt'只会打印_string_'points.txt',它不会**打印名为'points的_file_的内容。txt'。要在Bash shell中打印该文件的内容(&我假设Cygwin),您可以使用'cat points.txt'。但是,真的不推荐通过'subprocess'运行'cat'(或'echo')。 –

回答

0

鉴于分别在x和点Y的COORDS作为两个列表xy,可以管在像这样的数据(使用的communicate可选输入参数):

points = zip(x,y) 
# convert points to a valid string to pipe in 
input = '\n'.join(['{0} {1}'.format(*point) for point in points]) 

args = 'greenspline -R0/10 -I0.5 -Sc'.split() 
p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
out, err = p.communicate(input) 
print(out) 
+0

感谢所有这些建议重新压缩,但管道仍然无法正常工作。 @lemonhead当我尝试你的代码时,我得到: out,err = p.communicate(输入) 文件“C:\ Python32 \ lib \ subprocess.py”,行819,处于通信状态 return self._communicate(input) 文件“C:\ Python32 \ lib \ subprocess.py”,行1043,在_communicate self.stdin.write(输入) TypeError:'str'不支持缓冲区接口 – RustyC

+0

行 - 想想我已经解决了这个最后一个在输入上使用.encode()。我正在使用的简单测试示例将文本作为输入。 – RustyC