【问题标题】:Python, faking stdinPython,伪造标准输入
【发布时间】:2011-01-26 18:05:32
【问题描述】:

我目前正在 python 中编写对 darcs 的抽象,但是一旦我尝试将数据发送到我的存储库,存储库就会请求密钥;我在想是否有可能让 python 使用标准输入或其他方式将密钥发送到 darcs,以模拟用户将输入的内容,因为以这种方式;我可以让用户简单地存储一个包含他们信息的文件,python 会简单地读取这个文件并触发它的内容。

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

是我用来启动 darcs 的代码吗?执行("darcs %s" % (parems))

【问题讨论】:

  • 你是如何启动 darcs 的?通过子流程?
  • subprocess.Popen(command, shell=True) - 没错
  • 好吧,你在这方面做了多少?你在使用stdin=subprocess.PIPE.communicate() 吗?向我们展示您的代码。
  • @Skeen:请用所有事实更新您的问题。请发布足够的代码,以便我们可以看到您在做什么。
  • 一点也不远,实际上无处可去,我有点放弃尝试了;我考虑过一些管道的事情,但我不知道该怎么做。 - 因此我在这里,几乎只是在寻找一种开始的方式;您提到的两者中哪一个是最好的,在您看来,他们的优势和周度是什么。

标签: python version-control stdin pipe


【解决方案1】:

试试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')

【讨论】:

  • 这看起来真的是我正在寻找的东西:) - 我猜期望只是在标准输出上听?而 sendline 只提供标准输入?
  • 是的,它将标准输入/标准输出的所有细节抽象到您的子进程中。
  • Windows?哦。你应该在你的问题中澄清这一点,并添加一个“windows”标签。
  • 你可以这么说,但我试图独立于平台,因此我使用 python。 :)
【解决方案2】:

使用subprocess module

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

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

Popen.communicate(input=None)

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

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

注意,如果你想向进程的标准输入发送数据,你需要使用stdin=PIPE创建Popen对象。同样,要在结果元组中获得 None 以外的任何内容,您也需要提供 stdout=PIPE 和/或 stderr=PIPE

【讨论】:

  • 我正在使用该模块来创建流程,但是我不确定如何准确连接管道。
  • 我认为这将是我的解决方案:)
  • @Skeen,很有趣。这是一个非常简单的解决方案,大多数人认为您需要从原始问题中得到 pexpect。谢谢。很高兴您的问题得到解决。
  • 其实我试过用pexports,但是没有windows支持
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2011-11-30
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多