且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

python - 如何输入输入,读取输出,然后根据接收到的输出输入输出到python中的exe文件?

更新时间:2022-11-30 13:19:36

考虑一个简单的应用程序,它具有一些基本的执行控制流,并且只是将其 STDIN 与 STDOUT 反向回显 - 这可以是任何可执行文件,但我们将坚持使用Python 为简单起见 - 例如,app.py:

Consider a simple app that has some basic execution control flow and just echoes its STDIN in reverse to the STDOUT - this can be any executable but we'll stick with Python for simplicity - say, app.py:

#!/usr/bin/env python

import sys

sys.stdout.write("::BEGIN::\n")  # tell our listener that we're listening...
sys.stdout.flush()  # flush the STDOUT buffer
while True:  # a simple event loop
    line = sys.stdin.readline().rstrip()  # read a line from STDIN
    if line:  # ignore empty lines
        if line == "::END::":  # just a convenient way to shut down the app
            sys.stdout.write("::END::\n")  # tell our listener that we're done
            sys.stdout.flush()  # flush the STDOUT buffer
            break  # we're finished here
        sys.stdout.write(line[::-1])  # write the reversed line to STDOUT
        sys.stdout.write("\n")  # add a new line to the STDOUT
        sys.stdout.flush()  # flush the STDOUT buffer

然后如果你想打开这个应用程序并从你的 Python 脚本中与它通信,你需要做的就是控制子进程 STDOUT 和 STDIN,你可以无限期地这样做,例如:

Then if you want to open this app and communicate with it from your Python script all you need to do is control the subprocesses STDOUT and STDIN and you can do this indefinitely, for example:

import subprocess

# start our subprocess, forward its STDOUT and STDIN to the internal buffers
proc = subprocess.Popen(["python", "app.py"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)

# lets define our data to be sent one by one to our app.py, including ::END:: to exit...
items = ["test", "data", "to", "run", "sequentially", "::END::"]

# a convenience function to get the next item and write it to the passed buffer
def send_next_item(buf):
    item = items.pop(0)  # pop the first element from `items`
    print("REQ: {}".format(item))
    buf.write(item)  # write it to the passed buffer
    buf.write("\n")  # write a new line to the passed buffer
    buf.flush()  # flush the passed buffer

while True:  # wait for a prompt by our app
    line = proc.stdout.readline().rstrip()
    if line == "::BEGIN::":
        print("BEGIN!")
        send_next_item(proc.stdin)  # send the first item to the processes' STDIN
    elif line == "::END::":
        print("END!")
        break  # nothing more to do
    elif line:  # ignore empty lines
        print("RES: {}".format(line))
        send_next_item(proc.stdin)  # send the next item to the processes' STDIN

当你运行它时,你会得到如下输出:

When you run this you'd get an output like:

BEGIN!
REQ: test
RES: tset
REQ: data
RES: atad
REQ: to
RES: ot
REQ: run
RES: nur
REQ: sequentially
RES: yllaitneuqes
REQ: ::END::
END!

当然,你可以做进一步的处理来决定如何正确响应被调用应用程序的输入请求,这只是一个基本的例子.

Of course, you can do further processing to decide on how to properly respond to the called application's input request, this is just a basic example.