python - 在流程开始执行后(在完成之前)向 subprocess.Popen() 提供标准输入

标签 python python-3.x subprocess

我正在用 Python3 中的远程 shell 实用程序制作一个程序,使用套接字和子进程。到目前为止一切正常,但我遇到了一个我找不到解决方案的问题。这是我的服务器脚本上的代码,它执行从客户端收到的命令:

process = subprocess.Popen(client_buffer.decode('utf-8').split(), stdout = subprocess.PIPE) # Creating a process
        while True: # Reading and sending the stdout from the process in realtime
            shell_output = process.stdout.readline() # Read a line from stdout
            return_code = process.poll()
            print(shell_output)
            print(return_code)
            if shell_output.decode('utf-8') == '' and return_code is not None: 
                #print("Process execution complete. Sending user prefix")
                send(client, ("<#" + color.user + getpass.getuser() + color.endc + "@" + color.dir + cwd() + color.endc + ">").encode('utf-8'))
                break
            elif shell_output: 
                # Process execution incomplete, signaling to client with code 2
                send(client, int_to_bytes(2))
                # And sending the next line of stdout
                send(client, shell_output)

一切正常,我很满意,但有一个限制我不知道如何删除。 也就是说,我可以轻松地为服务器提供带参数的命令,服务器将执行它并将输出发回,效果很好,但是如果由命令启动的程序要求额外的输入(例如“(y/n )”问题)在流程执行结束之前(执行中),我不知道如何向流程提供输入。

我可以用 subprocess.Popen() 做这个吗?任何线索都会有所帮助,我提前感谢您。忘记补充了,这个程序是要在 Linux 中使用的。

P.S 我没有在代码示例中提供定义/声明的任何函数和变量都是无关紧要的,但该项目可以在我的 github 上找到以防有人想看更多代码

最佳答案

首先我觉得readline()这里是有问题的,除非程序的提示以newline()结尾:程序在readline( ) 正在等待行尾。我认为您将不得不改用 read() 并做一些更底层的事情。

要实际向程序发送一些内容,我认为您可以写入 process.stdin

看看 pexpect ( https://pexpect.readthedocs.io )。我不确定它是否适合您的用例,但如果它适合您的用例,它可以让生活更轻松,所以值得努力去了解。

另一件需要考虑的事情:许多命令都有一个选项可以使其在没有额外提示的情况下运行,以防止您在从另一个程序运行时遇到问题。如果您正在使用的程序属于这种情况,那将是迄今为止最简单的解决方案。

关于python - 在流程开始执行后(在完成之前)向 subprocess.Popen() 提供标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65885656/

相关文章:

python - processpoolexecutor 子进程突然停止

python - pickle 在做什么?

python - 为什么这段代码在不同的发行版/Unix 上表现不同?

python - 如何从不同的Python脚本调用Python脚本?

python - 如何让 Windows 资源管理器以 Python 字符串形式返回文件路径?

Python SUDS SOAP 请求到 https 服务 401

python - 如何确定 GPU 在我的操作系统上是否可用?

python - 使用 Selenium Python 通过值属性查找元素

python - 在空格后拆分字符串

python - 如何在函数参数中留出空格?