Python子进程stdin管道

时间:2014-12-18 12:44:35

标签: python subprocess

您好我有这样的问题。我需要通过子进程登录。所以我想创建一个输入管道并为它们写入登录名和密码。所以我尝试做这样的事情:

sp = subprocess.Popen([cmd],stdout=subprocess.PIPE, stdin=subprocess.PIPE)
i, o = sp.communicate()

在第一个字符串后,我有这样的错误tcgetattr: Inappropriate ioctl for device。我没有o的无价值。在这种情况下,如何将smth写入管道。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

来自subprocess.communicate(input) docs

  

可选的输入参数应该是要发送给子级的数据   处理   ...
  请注意,如果要将数据发送到进程的stdin,则需要执行此操作   使用stdin = PIPE创建Popen对象。同样,得到任何东西   除了结果元组中的None之外,你需要给stdout = PIPE   和/或stderr = PIPE。

即,要将输入传递给子进程,请指定input参数;要获取非None o值,您必须指定stderr=PIPE

在许多情况下,密码提示和密码本身不会从管道写入/读取,而是直接从/从终端读取,即,您可能需要使用伪tty来传递密码,除非该命令允许设置接受密码的选项通过stdin。您可以使用pexpect使用pty与子流程进行交互。请参阅 Why not just use a pipe (popen())?

中的第一个原因