产生多个进程并以非阻塞方式与它们进行交互

时间:2014-05-26 22:33:47

标签: python subprocess pexpect

我需要生成多个进程(同一个进程不止一次)并以非阻塞方式与它们进行交互。由于每个进程都是一个需要从命令行输入的python脚本,因此我还需要一些与它相互作用的期望方式。

Pexpect本来是完美的,只要它不让我等到被叫方法结束。

子流程是我需要的吗?我已经尝试过以期待的方式使用它,但我完全失败了。

这是Pexpect的代码:

def test_applying_policies( self ):
    root = pexpect.spawn ('pyretic.py -f -m p0 pyretic.step_four root password') 
    root.logfile = sys.stdout 
    root.expect('How many new users do you want to create?')
    root.sendline(str(num_users))
    root.expect('dumb_network_created')

    self.users_list = []
    x=1
    try:
        while x<=num_users:
            temp = controller(x)
            self.users_list.append(temp)
            x+=1
    except:
        for user in self.users_list:
            user.close()
        root.sendline('q')
        root.terminate()

    x=0
    while x<num_users:
        res = self.users_list[x].install_policy(policy_modules[x]) 
        #I got stuck here, even if the install_policy 
        #method does not return any value
        self.assertTrue(res)
        x+=1

    for user in self.users_list:
        user.close()
    root.sendline('q')
    root.terminate()

这是控制器类:

class controller():

def __init__(self,name):
    s = 'pyretic.py -f -m p0 pyretic.step_four user' + 
                    str(name) + ' password'+ str(name)

    self.p = pexpect.spawn(s)
    self.p.logfile = sys.stdout
    self.name = name
    self.p.expect('dumb_network_created')

def close(self):
    self.p.sendline( 'q' )
    self.p.terminate()

def install_policy(self, policy):

    self.p.sendline( 'a' )
    self.p.expect('enter the name of the module:')
    self.p.sendline(policy)
    res = self.p.expect ( ['NACK','ACK',pexpect.TIMEOUT] )

    if res == 1:
        return True
    else:
        return False

有什么建议吗?

0 个答案:

没有答案