【发布时间】:2012-07-12 13:30:56
【问题描述】:
我想在 Python (2.6.5) 中运行一个脚本,该脚本遵循以下逻辑:
- 提示用户输入密码。它看起来像(“输入密码:”)(*注意:输入不会回显到屏幕)
- 输出无关信息
- 提示用户回复(“Blah Blah filename.txt blah blah (Y/N)?:”)
最后一行包含我需要解析的文本(filename.txt)。提供的响应无关紧要(只要我可以解析该行,程序实际上可以在不提供响应的情况下退出这里)。
我的要求有点类似于 Wrapping an interactive command line application in a Python script,但那里的响应似乎有点令人困惑,即使 OP 提到它没有,我的要求仍然挂起给他。
通过环顾四周,我得出结论,subprocess 是执行此操作的最佳方式,但我遇到了一些问题。这是我的 Popen 行:
p = subprocess.Popen("cmd", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
-
当我在
stdout上调用read()或readline()时,提示是打印机打印到屏幕上并且它挂起。 -
如果我为
stdin调用write("password\n"),则会将提示写入屏幕并挂起。write()中的文字没有写(我没有把光标移到新的一行)。 -
如果我调用
p.communicate("password\n"),与 write() 的行为相同
我在这里寻找一些关于输入stdin 的最佳方式的想法,以及如果您觉得大方的话,可能如何解析输出中的最后一行,尽管我最终可能会弄清楚。
【问题讨论】:
-
你应该看看pexpect:noah.org/wiki/pexpect
-
我认为你需要写入标准输出并从标准输入读取......而不是像你上面所说的那样
-
@Joran 哈哈是的,对不起。这就是我的意思。
-
@ColinDunklau 我希望尽量减少使用外部模块
-
如果有人想在现代 Python 中做到这一点,我已经在这里发布了明确的答案:stackoverflow.com/a/56051270/240515
标签: python subprocess stdout stdin interactive