Python,模拟标准输入
我现在正在用Python写一个对darcs的封装。不过,当我尝试把数据发送到我的仓库时,仓库会要求输入一个密钥。我在想,能不能让Python通过标准输入(stdin)或者其他方式,模拟用户输入这个密钥。这样的话,我就可以让用户简单地把他们的信息存储在一个文件里,然后Python读取这个文件,自动发送里面的内容。
def execute(cmd):
proc = subprocess.Popen(cmd, shell=True)
proc.wait()
这是我用来启动darcs的代码:execute("darcs %s" % (parems))
2 个回答
4
试试 pexpect
,这个工具就是为了这个目的而设计的(用来自动化其他需要互动的应用程序)。
你可以查看这个链接了解更多信息: http://pypi.python.org/pypi/pexpect/
以下是文档中的一个使用示例:
import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('cd pub')
child.expect('ftp> ')
child.sendline ('get ls-lR.gz')
child.expect('ftp> ')
child.sendline ('bye')
3
使用subprocess
模块:
subprocess
模块可以让你启动新的进程,连接它们的输入/输出/错误管道,并获取它们的返回代码。
subprocess.Popen.communicate
方法用于进程间的通信:
Popen.communicate(input=None)
与进程进行交互:向标准输入(stdin)发送数据。从标准输出(stdout)和标准错误(stderr)读取数据,直到文件结束。等待进程结束。可选的输入参数应该是一个字符串,用于发送给子进程,如果不需要发送数据给子进程,可以设置为None。
communicate()会返回一个元组(stdoutdata, stderrdata)。
注意,如果你想向进程的标准输入发送数据,需要在创建Popen对象时使用
stdin=PIPE
。同样,如果你想在结果元组中获取其他内容而不是None,也需要设置stdout=PIPE
和/或stderr=PIPE
。