Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用管道将一个进程传递给另一个进程(读取文件内容获取内容创建新文件)?_Python_File_Process_Subprocess_Pipe - Fatal编程技术网

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

Python 如何使用管道将一个进程传递给另一个进程(读取文件内容获取内容创建新文件)?,python,file,process,subprocess,pipe,Python,File,Process,Subprocess,Pipe,如问题中所述,我希望传递进程A,即下面读取outfile.txt文件内容的代码,传递给进程B,进程B将“下载”进程A的内容,并使用进程A的内容创建一个新文件 我该怎么做,或者有人能给我一个主意吗 import subprocess proc = subprocess.Popen(['python','outfile.txt'],stdout=subprocess.PIPE) while True: line = proc.stdout.readline() if not line:

如问题中所述,我希望传递进程A,即下面读取outfile.txt文件内容的代码,传递给进程B,进程B将“下载”进程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())

我不知道我是否明白你想做什么

对我来说,
过程A
过程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=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())


你所说的流程内容是什么意思?我不明白你想做什么。您只能传递数据/字符串,不能传递进程。如果您想运行两个
子进程
,那么在相同的代码中运行它,并在另一个进程中使用
stdin
从第一个进程开始使用
stdout
,这样您就可以将数据/字符串从一个进程发送到另一个进程。运行
open('outfile.txt')。read()
?或
对于打开的行('outfile.txt'):打印('test:',line.rstrip())
最终使用
sys.stdout.write
而不是
print()
收到erorr消息吗?始终将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图,也不是指向外部门户的链接)进行讨论(不是评论)。还有其他有用的信息。@furas我只想让进程A(上面的代码)和进程B通过管道进行通信。进程A逐行读取文件并将其发送给进程B,然后进程B将其写入另一个文件。
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())