一些序言: (不知道这是否相关,但我在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]])
但有一个更简单的方法?
正如你可能可以收集我的编程知识水平低,所以你可以请温柔 - 并解释所有答案的俗语!
参见'拉链(x,y)'来创建基于两个独立列表的元组列表。 –
我认为你的代码应该读取'p = subprocess.Popen(args2,stdout = subprocess.PIPE,stdin = echo.stdout)' –
FWIW,shell'echo'命令(在大多数shell中)只是打印它的参数(s)到标准输出,所以'echo points.txt'只会打印_string_'points.txt',它不会**打印名为'points的_file_的内容。txt'。要在Bash shell中打印该文件的内容(&我假设Cygwin),您可以使用'cat points.txt'。但是,真的不推荐通过'subprocess'运行'cat'(或'echo')。 –