python写exe程序可以和服务端交互_通过Python与Windows控制台应用程序交互

该博客文章介绍如何使用Python的`subprocess`模块与交互式应用程序如cmd.exe进行交互,包括读取输出、发送命令并正确处理提示。示例代码展示了如何通过逐行读取和分析输出来实现这一目标,特别处理了命令行提示符的情况。
摘要由CSDN通过智能技术生成

您的问题在于您正在尝试控制一个交互式应用程序。

stdout.read()将继续读取,直到它到达流,文件或管道的末尾。不幸的是,如果是交互式程序,管道只有在程序退出时才关闭;如果您发送的命令不是"quit"以外的其他命令,则永远不会。

您将不得不恢复为使用stdout.readline()逐行读取子进程的输出,并且您最好有一种方法来告诉程序何时准备好接受命令,以及何时发出命令到程序完成,你可以提供一个新的。在像cmd.exe这样的程序的情况下,即使readline()也不能满足,因为指示可以发送新命令的行不会被换行符终止,因此必须逐字节地分析输出。下面是运行cmd.exe一个示例脚本,找提示,然后发出dir然后一个exit:

from subprocess import *

import re

class InteractiveCommand:

def __init__(self, process, prompt):

self.process = process

self.prompt = prompt

self.output = ""

self.wait_for_prompt()

def wait_for_prompt(self):

while not self.prompt.search(self.output):

c = self.process.stdout.read(1)

if c == "":

break

self.output += c

# Now we're at a prompt; clear the output buffer and return its contents

tmp = self.output

self.output = ""

return tmp

def command(self, command):

self.process.stdin.write(command + "\n")

return self.wait_for_prompt()

p = Popen(["cmd.exe"], stdin=PIPE, stdout=PIPE)

prompt = re.compile(r"^C:\\.*>", re.M)

cmd = InteractiveCommand(p, prompt)

listing = cmd.command("dir")

cmd.command("exit")

print listing

如果时间不是重要的,并且不需要交互的用户,也可以是很简单,只是为了批量调用:

from subprocess import *

p = Popen(["cmd.exe"], stdin=PIPE, stdout=PIPE)

p.stdin.write("dir\n")

p.stdin.write("exit\n")

print p.stdout.read()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值