Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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_Python 3.x_Subprocess - Fatal编程技术网

Python 子流程管道标准输出到两个不同的流程

Python 子流程管道标准输出到两个不同的流程,python,python-3.x,subprocess,Python,Python 3.x,Subprocess,我试图将子进程标准输出重定向到两个不同的进程。 对一个进行操作很好,但对两个不同的过程不太有效 代码: 正如我所说,理论上应该有效,因为仅使用p3而不使用p4时有效, 但是在这种情况下不工作可能是因为stdout被锁定 任何指导都将不胜感激 我正在反转终止函数中的args数组,原因是在终止父进程之前先终止子进程。通常情况下,.read()的工作方式,在我知道的大多数情况下,为了第二次使用它,必须使用.seek()将读取头倒回原来的位置 见: 您可以使用通信并手动传入标准输出数据(读取一次,

我试图将
子进程
标准输出
重定向到两个不同的进程。 对一个进行操作很好,但对两个不同的过程不太有效

代码:

正如我所说,理论上应该有效,因为仅使用
p3
而不使用
p4
时有效, 但是在这种情况下不工作可能是因为
stdout
被锁定

任何指导都将不胜感激

我正在反转终止函数中的
args
数组,原因是在终止父进程之前先终止子进程。

通常情况下,
.read()
的工作方式,在我知道的大多数情况下,为了第二次使用它,必须使用
.seek()
将读取头倒回原来的位置

见:

您可以使用
通信
并手动传入标准输出数据(读取一次,同时传入两个数据):

out,err=p2.communicate()#out是无的,因为您没有
p2_输出=''.join(列表(输出))
p3=Popen([…],stdin=PIPE,…)
p4=Popen([…],stdin=PIPE,…)
标准输出数据3,错误=p3。通信(输入=p2输出)
标准输出数据4,错误=p4。通信(输入=p2输出)
另外请注意,这可能会改变轮询的方式,与您当前的方式相比

相关的:


使用communicate比使用stdin=p2.stdout更有效吗?@ShantanuShady我认为在这种情况下,效率不是什么问题,更令人担忧的是能够定制数据传递的方式以获得预期的结果,这是有效的,而不是无效的。直接回答你的问题,我不知道,但是,我想,因为有一个额外的步骤,或两个,可能会有几微秒的差异。谢谢,不得不解码它是以字节打印的形式出现的('out is','out.decode('utf8'))
def terminate_processes(*args):
    try:
        for i in reversed(args):
            try:
                i.terminate()
            except:
                pass
    except:
        pass

def main(x='192.168.0.2'):


    # system('sudo nmap -O '+x+'|grep "Running: " > os_detect.txt')
    # system('cat os_detect.txt|cut -d " " -f2 > os.txt')
    # system('cat os_detect.txt|cut -d " " -f3 > os_version.txt')
    
    p1 = subprocess.Popen(['sudo', 'nmap', '-O', str(x)], stdout=subprocess.PIPE)
    
    p2 = subprocess.Popen(['grep', 'Running: '],  stdin=p1.stdout, stdout=subprocess.PIPE)
    
    p3 = subprocess.Popen(['cut', '-d', ' ', '-f2'],  stdin=p2.stdout,
                                                    stdout=subprocess.PIPE, 
                                                    stderr=subprocess.STDOUT,
                                                    universal_newlines=True)
    
    p4 = subprocess.Popen(['cut', '-d', ' ', '-f3'],  stdin=p2.stdout,
                                                    stdout=subprocess.PIPE, 
                                                    stderr=subprocess.STDOUT,
                                                    universal_newlines=True)

    while p3.poll() is None:
        for line in p3.stdout.readlines():
            if line.strip():
                print(line.strip())

    while p4.poll() is None:
        for line in p4.stdout.readlines():
            if line.strip():
                print(line.strip())

    terminate_processes(p1,p2,p3,p4)