向cmd发送许多命令

时间:2016-11-14 14:17:07

标签: python windows cmd subprocess runtime-error

我试图根据他发给我的答案发送cmd多个命令。

我收到运行时错误消息:

ValueError: I/O operation on closed file

当我运行这样的事情时:

import subprocess
process = subprocess.Popen("cmd.exe", stdout=subprocess.PIPE,stdin=subprocess.PIPE)
answer = process.communicate(input="some command\n" + '\n')[0]

"""
choosing another command according to answer
"""

print process.communicate(input=another_command + '\n')[0]
process.kill()

关于如何解决问题的任何想法?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

不要将命令发送到cmd.exe。直接调用您的命令,如:

subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE,stdin=subprocess.PIPE)

如果以这种方式使用stdin,也许你不需要stdin的管道。

答案 1 :(得分:0)

错误是正常的。 communicate关闭子进程的标准输入,以指示没有更多的输入处于挂起状态,以便子进程可以刷新其输出。因此,您无法在一个子流程上链接多个communicate调用。

但是如果命令很简单(输入数据不是几千字节),并且如果你不需要在发送下一个命令之前收集和处理一个命令的输出,你应该能够编写所有命令序列,在两个序列之间读取尽可能多的输出。在最后一个命令之后,您可以关闭子进程标准输入并等待它终止,仍然整理输出:

process = subprocess.Popen("cmd.exe", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
process.stdin.write("some command\n\n")
partial_answer = process.stdout.read()  # all or part of the answer can still be buffered subprocess side
...
process.stdin.write("some other command\n\n")
...
# after last command, time to close subprocess
process.stdin.close()
retcode = None
while True:
    end_of_answer += process.stdout.read()
    if retcode is not None: break