python2和python3多处理错误

时间:2020-06-10 20:00:58

标签: python python-3.x python-2.7 multiprocessing devops

我正在python2和python3环境中运行以下脚本。

import subprocess as sub
import sys
#import time
import multiprocessing, time, signal
def tcpdump():
    p = sub.Popen(('sudo', 'tcpdump', '-l', '-xx'), stdout=sub.PIPE)
    for row in iter(p.stdout.readline, b''):
        sys.stdout.write(row.rstrip())
def print_hello():
    print "yo"
    time.sleep(20)
    print "goodbye"
def main():
    p1 = multiprocessing.Process(target=tcpdump)
    p2 = multiprocessing.Process(target=print_hello)
    p1.start()
    p2.start()
    while p2.is_alive():
        time.sleep(2)
    p1.terminate()
    print "We terminated"
    #p1.terminate()
    #print "one more time"
    #print_hello()
    #tcpdump()
main()

在python3中,它运行正常,但是在python2中,这给了我一个错误

tcpdump: Unable to write output: Broken pipe

有人知道背后的原因吗?

P.S。在python3中运行之前,我更改了打印语句。

1 个答案:

答案 0 :(得分:0)

您需要先退出进程,然后再离开程序并从子进程中删除sudo。这段代码可以在我的机器上运行:

import subprocess as sub
import sys
#import time
import multiprocessing, time, signal


def tcpdump(p):
    for row in iter(p.stdout.readline, b''):
       sys.stdout.write(row.rstrip())
def print_hello():
    print "yo"
    time.sleep(5)
    print "goodbye"
def main():
    p = sub.Popen(('tcpdump', '-l', '-xx'), stdout=sub.PIPE) 
    p1 = multiprocessing.Process(target=tcpdump, args=(p,))
    p2 = multiprocessing.Process(target=print_hello)
    p1.start()
    p2.start()
    while p2.is_alive():
        time.sleep(2)
    p1.terminate()
    p.kill()
    print "We terminated"
    #p1.terminate()
    #print "one more time"
    #print_hello()
    #tcpdump()
main()

使用sudo运行此脚本,一切都会正常。

相关问题