怎样,我可以将第一个进程(函数)的输出传递给python中的下一个进程(函数)吗?

时间:2016-12-11 22:36:02

标签: python subprocess stdin pipeline temporary-files

在以下程序中

1)我想将输出写入文件 2)并且,还希望通过管道文件的最终输出来访问另一个进程中的下游输出文件,而不是从中读取。

使用以下python代码:

global product
product = ""
product_file = open('product.txt', 'w')   

def read_file():   
    file1 = open ('file01.txt', 'r')
    data1 = read.file1().rstrip('\n')
    data1_lines = data1.split('\n)
    for lines in data1_lines:
        columns = lines.split('\t')
        x = int(columns[0])
        y = int(columns[1])
        prod = x*y
        output = open('product.txt', 'a')
        output.write(str(x) + '\t' + str(y) + '\t' + str(prod))
        output.close()
        product += str(x +'\t'+ y +'\t'+ prod +'\n')

def manipulate_file():
    global product;
    for lines in product:
        line = product.split('\t')
        do..something.....

我想从def read_file()访问最终输出文件,以便在下游进程中使用(函数,即def mainpulate_file()),而不是再次打开它。

我想使用subprocess.call和/或stdin-out和/或tempfile,最后在完成后清除内存。

我阅读了几个例子,但找不到任何明确的解决方法。

我将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您希望能够将当前写入product.txt的输出传递给其他进程,则必须将其写入stdout。这可以这样做:

line = str(x) + '\t' + str(y) + '\t' + str(prod)
output.write(line)
print(line, end='')

end=''部分是为了防止每次输入后打印换行,因为您当前的代码也没有将它们写入文件。如果你真的想要换行,你可以这样得到它们:

output.write(line + '\n')
print(line)

如果您实际上只想稍后在脚本中使用输出,则可以在进入循环之前创建列表并将每行附加到该列表。在循环之后,您可以通过'\n'.join(your_list)连接所有行。

答案 1 :(得分:0)

我们甚至不需要global参数。

product = ""
product_file = open('product.txt', 'w')   

def read_file():   
    file1 = open ('file01.txt', 'r')
    data1 = read.file1().rstrip('\n')
    data1_lines = data1.split('\n)
    for lines in data1_lines:
        columns = lines.split('\t')
        x = int(columns[0])
        y = int(columns[1])
        prod = x*y
        output = open('product.txt', 'a')
        output.write(str(x) + '\t' + str(y) + '\t' + str(prod))
        output.close()
        product += str(x +'\t'+ y +'\t'+ prod +'\n')
    return manipulate_file(product)

def manipulate_file(product):
    data = StringIO(product)
    data_lines = data.read().rstrip('\n).split('\n')
    for lines in data_lines:
        do..something.....

<强>所以:

  • 只需创建一个可在循环中更新的变量。

  • 使用定义的函数

  • 返回此变量
  • 使用返回的函数读取文件,但需要使用StringIO读取,因为数据在控制台上。