Python 向cmd发送许多命令

Python 向cmd发送许多命令,python,windows,cmd,subprocess,runtime-error,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

我正试图根据他发给我的答案发送
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()
你知道怎么解决这个问题吗


谢谢你的帮助

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

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

如果以这种方式使用stdin,您可能不需要该管道。

错误是正常的<代码>通信关闭子流程的标准输入,以指示没有更多的输入处于挂起状态,以便子流程可以刷新其输出。因此,不能在单个子流程上链接多个
通信
调用

但是,如果命令足够简单(输入数据不多KB),并且在发送下一个命令之前不需要收集和处理一个命令的输出,那么应该能够按顺序写入所有命令,在两个命令之间读取尽可能多的输出。在执行最后一个命令后,您可以关闭子流程标准输入并等待其终止,同时仍然整理输出:

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

你能提供一个更大的画面吗?您是否在
process.kill()之后发送命令?如果没有,您能否提供一些代码示例(使用真实的命令而不是
“some command”
)?您尝试在cmd中运行的命令有可能会终止shell。即使没有
进程.kill()
,这两个命令都是
“ipconfig\n”
。第一个命令正在工作,第二个命令给我运行时错误执行命令可能会发送返回代码,关闭Popen对象。例如,如果您执行ipconfig,然后执行
process.poll()
,您可能会看到
0
返回代码。是的,它不会显示
0
,是否有任何方法避免关闭
Popen对象
?如果我想使用
子处理
通信()
,这可能吗?非常感谢你的帮助@您的任务是使用子流程和通信()还是解决特殊问题?您可以使用“通信”将输入导入交互式comand。但是我不认为你可以用它来将命令传输到cmd。由于某种原因,我的计算机无法识别cmd.exe作为系统程序,即使我的所有路径都完全正确,这导致我尝试使用子进程绕过这个问题,不,当我尝试时,我会遇到这样的错误
WindowsError:[错误2]系统找不到指定的文件
@EyalS,
dir
命令内置于cmd.exe中。没有
dir.exe
。使用
shell=True
时,
Popen
执行的实际命令行是
C:\Windows\System32\cmd.exe/C“dir”
。我假设“custom command”是指外部命令,如
ipconfig.exe
python.exe
。如果不使用专用读卡器线程,请注意死锁。在Windows中,您可以使用
msvcrt.get\u osfhandle(process.stdout.fileno())
中的句柄调用以获取可用字节数。这样,当cmd.exe在stdin上等待命令时,您就不会在尝试读取更多可用数据时死锁。对于使用shell,您还可以设置自定义提示,并在读取提示之前一次读取一个字节。此外,传递
bufsize=0
以防止缓冲
过程。如果您不想重复调用
flush
,并且cmd.exe需要行尾为
“\r\n”
,而不是
“\n\n”
,则stdin。