我有一个脚本,我想从Python中运行(2.6.5),其遵循以下逻辑:
- 提示用户输入密码。它看起来像(“输入密码:“)(* 注意:输入不回显到屏幕)
- 输出无关信息
- 提示用户输入响应(“Blah Blah filename.txt blah blah(Y/N)?:“)
最后一个提示行包含了我需要解析的文本(文件名。提供的响应并不重要(程序实际上可以在不提供响应的情况下退出,只要我能解析该行)。
我的要求 * 有点 * 类似于 * 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
的最佳方式的想法,如果你觉得慷慨的话,我可能会找到如何解析输出中的最后一行。
2条答案
按热度按时间ryhaxcpt1#
如果您正在与子进程生成的程序通信,则应该检查 A non-blocking read on a subprocess.PIPE in Python。我的应用程序也遇到了类似的问题,发现使用 * 队列 * 是与子进程进行持续通信的最佳方式。
至于从用户那里获取值,您可以始终使用raw_input()内置函数来获取响应,对于密码,请尝试使用
getpass
模块从用户那里获取非回显密码。然后可以解析这些响应并将它们写入子进程的stdin。我最终做了类似于以下的事情:
一旦创建了队列并启动了线程,就可以循环从用户获取输入、从进程获取错误和输出,然后处理并向用户显示它们。
a8jjtwal2#
对于简单的任务来说,使用线程可能有点大材小用。可以使用
os.spawnvpe
。它将生成脚本shell作为一个进程。您将能够与脚本进行交互式通信。在这个例子中,我将password作为参数传递,显然这不是一个好主意。