Python,模拟标准输入

1 投票
2 回答
537 浏览
提问于 2025-04-16 10:40

我现在正在用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

撰写回答