如何使用管道将一个进程传递给另一个进程(读取文件内容-获取内容-创建新文件)?

How can I pass one process to another using pipe (read file contents-get contents-create new file)?

在问题中,我想传递进程 A,即下面读取 outfile.txt 文件内容的代码,传递给进程 B,后者将“下载” outfile.txt 文件的内容进程A并用进程A的内容创建一个新文件?

我该怎么做,或者有人可以给我一个主意吗?

import subprocess
proc = subprocess.Popen(['python','outfile.txt'],stdout=subprocess.PIPE)
while True:
  line = proc.stdout.readline()
  if not line:
    break
  print("test:", line.rstrip())

不知道你的意思我理解了没有

对我来说 Process AProcess B 意味着一个脚本中有两个 Popen

如果你想直接从一个进程发送到另一个进程那么你可以使用

process_B = subprocess.Popen(..., stdin=process_A.stdout)

最少的工作代码。它在 Linux

上运行 ls | sort -r
import subprocess
#import sys

process_A = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
process_B = subprocess.Popen(['sort', '-r'], stdout=subprocess.PIPE, stdin=process_A.stdout)

# - show result - 

for line in process_B.stdout:
    #sys.stdout.write(line.decode())
    print(line.decode().rstrip())

或使用 `communicate()

显示结果
import subprocess

process_A = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
process_B = subprocess.Popen(['sort', '-r'], stdout=subprocess.PIPE, stdin=process_A.stdout)

# - show result - 

stout, stderr = process_B.communicate()
print(stout.decode())

编辑:

如果要在进程间修改数据

import subprocess

process_A = subprocess.Popen(['ls', '/'], stdout=subprocess.PIPE)
process_B = subprocess.Popen(['sort', '-r'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)

# - get all from one process -

stdout_A, stderr_A = process_A.communicate()
    
# - modify all -
 
stdout_A = stdout_A.upper()

# - send all to other process and get result -

stout_B, stderr_B = process_B.communicate(stdout_A)
print(stout_B.decode())

import subprocess

process_A = subprocess.Popen(['ls', '/'], stdout=subprocess.PIPE)
process_B = subprocess.Popen(['sort', '-r'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)

# - send from one process to another line by line - 

for line in process_A.stdout:
    line = line.upper() 
    process_B.stdin.write(line)

# - get result -

stout_B, stderr_B = process_B.communicate()
print(stout_B.decode())