我一直在使用os.system()与终端通信,效果很好。但是,我用它打开了一个需要写入命令的程序,但我不太确定如何执行此操作。
基本上,我正在运行:
tleap -f leaprc
这将在终端中打开程序,并显示:
*non-important code*
>
现在,我需要开始向程序发送命令,但我找不到任何可以写入>右侧的内容。 os.system()对此不起作用,而且,我不是精通 Python,我一无所知。
我一直在使用os.system()与终端通信,效果很好。但是,我用它打开了一个需要写入命令的程序,但我不太确定如何执行此操作。
基本上,我正在运行:
tleap -f leaprc
这将在终端中打开程序,并显示:
*non-important code*
>
现在,我需要开始向程序发送命令,但我找不到任何可以写入>右侧的内容。 os.system()对此不起作用,而且,我不是精通 Python,我一无所知。
或者尝试使用python-pexpect包而不是Subprocess。更容易和友好。
import pexpect
mypassword='somepassword'
child = pexpect.run('passwd guille') child.expect('Password:')
child.sendline(mypassword)
你可以尝试使用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
模块。