Python - 通过终端与开放式程序交谈

时间:2013-06-07 16:49:04

标签: python linux terminal communication

我一直在使用 os.system()与终端进行通信,这非常有效。然而,有了它,我打开一个需要写入命令的程序,我不太清楚如何做到这一点。

基本上,我正在跑步:

tleap -f leaprc

这将打开终端中的程序,它显示:

*non-important code*
>

现在,我需要开始向程序发送命令,但我找不到任何会写在> 右侧的内容。 os.system()对此不起作用,并且不精通Python,我很无能为力。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用subprocess.Popen

这里有一些使用python作为程序的示例代码。

>>> p = subprocess.Popen(['python'],stdin = subprocess.PIPE,stdout = subprocess.PIPE)
>>> p.stdin.write('print "Hello, world!"\n')
>>> p.stdin.write('for i in range(10):\n    print i\n')
>>> p.communicate()
('Hello, world!\r\n0\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n', None)

如果您在Linux上运行,将命令发送到终端的最简单方法是使用shlex.split功能。所以你打电话给

p = subprocess.Popen(shlex.split('tleaf -f leaprc'),stdin = subprocess.PIPE,stdout = subprocess.PIPE)

至少根据我的经验,在进程对象上调用communicate会关闭它,因此您只有一次机会读取输出。如果这不合适,我会查看pexpect模块。

答案 1 :(得分:0)

或者尝试使用 python-pexpect 包而不是 Subprocess 。更容易和友好。

import pexpect

mypassword='somepassword'

child = pexpect.run('passwd guille') child.expect('Password:')
child.sendline(mypassword)