Python,伪造stdin

时间:2011-01-26 18:05:33

标签: python version-control stdin pipe

我目前正在编写python中的darcs抽象,但是一旦我尝试将数据发送到我的存储库,存储库就会请求密钥;我在想是否有可能使用stdin或其他任何方式将密钥发送到darc,以模拟用户输入的内容,因为这样做;我可以允许用户简单地存储包含其信息的文件,而python只是读取该文件并触发其内容。

def execute(cmd):
    proc = subprocess.Popen(cmd, shell=True)
    proc.wait()

我正在使用的代码来启动darcs;执行(“darcs%s”%(parems))

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:3)

使用subprocess module

  

subprocess模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。

subprocess.Popen.communicate方法用于通讯:

  

Popen.communicate(input=None)

     

与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。 可选输入参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则为None。

     

communic()返回一个元组(stdoutdata,stderrdata)。

     

请注意,如果要将数据发送到进程的stdin,则需要使用stdin=PIPE创建Popen对象。同样,要在结果元组中获取除None之外的任何内容,您还需要提供stdout=PIPE和/或stderr=PIPE