我需要生成多个进程(同一个进程不止一次)并以非阻塞方式与它们进行交互。由于每个进程都是一个需要从命令行输入的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
有什么建议吗?