【发布时间】:2013-06-25 15:36:28
【问题描述】:
我正在尝试在传递参数时从 Python 运行命令 exe。我看过其他几个问题,我的问题不同的原因是因为我首先想在传递一些参数的同时调用一个 cmd exe 程序,然后我必须等待 10 秒让 exe 提示我一些用户名,然后是一些密码。然后我想将此输出输出到文件中。
如果之前已经调用过一个进程,有没有办法传递更多参数? 如何使 cmd exe 保持打开状态,因为一旦我调用它,进程就会终止。
谢谢
【问题讨论】:
我正在尝试在传递参数时从 Python 运行命令 exe。我看过其他几个问题,我的问题不同的原因是因为我首先想在传递一些参数的同时调用一个 cmd exe 程序,然后我必须等待 10 秒让 exe 提示我一些用户名,然后是一些密码。然后我想将此输出输出到文件中。
如果之前已经调用过一个进程,有没有办法传递更多参数? 如何使 cmd exe 保持打开状态,因为一旦我调用它,进程就会终止。
谢谢
【问题讨论】:
看看子进程通信和管道示例。
【讨论】:
subprocess.Popen()
这是一个示例(首先我必须创建一个简单的 python 应用程序,它需要一些时间来请求输入(本示例中为 6 秒),名为 wait.py
等待.py
import time
print "Sample Waiting App (waiting 6 seconds)"
time.sleep(6)
name = raw_input("Enter a Name: ")
print "Hello", name
这里是启动、等待、传递输入和读取输出的代码:
automator.py
from subprocess import Popen, PIPE, STDOUT
p = Popen(['python', 'wait.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
print p.communicate('Jason\n')[0]
这里是正在发生的事情的分解:
subprocess.Popen() 创建一个进程(运行 python 解释器并将 wait.py 脚本作为参数传递)并分配给 p。 最初我让 automator.py 睡眠 10 秒(给 wait.py 足够的时间来清除它的计时器),但正如 @J.F.Sebastian 指出的那样,这种睡眠是不需要的。原因是对“communicate()”的调用将阻塞,直到 wait.py 完成。另外因为 wait.py 是从 stdin 读取的,你实际上可以在 wait.py 读取它之前填充 stdin 的内容。对于从标准输入流读取的任何应用程序都是如此。
'Jason\n'通过p.communicate('Jason\n')[0]发送到进程并打印输出。请注意,stdout 显示的是 wait.py 打印语句的提示和输出,而不是输入,这是因为当您键入时输入不在 stdout 流中,它正在被回显。李>
【讨论】:
.write() 和.communicate()。将两者结合起来:print p.communicate(b"Jason")[0],(p.stdin.close() 在 communicate() 内部自动调用)2. time.sleep(10) 是不必要的。