在Python(Windows)中与子进程的连续交互

在Python(Windows)中与子进程的连续交互,python,windows,powershell,subprocess,Python,Windows,Powershell,Subprocess,我正在从python的一个新PowerShell窗口中启动一个脚本,我想让这个过程在后台运行,这样我就可以不断地与它交互 我已尝试使用以下代码: p = subprocess.Popen(['start powershell.exe', '-File', 'script.ps1'] shell = True, stdin = subprocess.PIPE, std

我正在从python的一个新PowerShell窗口中启动一个脚本,我想让这个过程在后台运行,这样我就可以不断地与它交互

我已尝试使用以下代码:

p = subprocess.Popen(['start powershell.exe', '-File', 'script.ps1']
                    shell    = True,
                    stdin    = subprocess.PIPE,
                    stdout   = subprocess.PIPE,
                    bufsize  = 1,
                    encoding ='utf-8')

p.stdin.write('input1')
p.stdout.readline()
p.stdin.write('input2')
p.stdout.readline()
p.stdin.write('input3')
p.stdout.readline()
但是p.stdin.write什么都不做。
如何解决这个问题?

我创建了一个简单的示例,以准确了解您想要什么。从这个告诉我你想要什么

test.py

import subprocess, sys, os

p = subprocess.Popen(['start', 'powershell.exe', '-File', 'H:\Coding\stack\script.ps1'],
                    shell=True,
                    stdout = subprocess.PIPE,
                    stdin = subprocess.PIPE,
                    bufsize = 1,
                    encoding ='utf-8'
                    )

while p.poll() is None:
    output = p.stdout.readline()
    print(output)

print('end of python'))
script.ps1

$input = Read-Host -Prompt 'input'
Write-Host $input
$input = Read-Host -Prompt 'input'
Write-Host $input
$input = Read-Host -Prompt 'input'
Write-Host $input
Write-Host 'end of process'

Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
结果

PS H:\Coding\stack>python test.py
(新窗口已启动)
输入:测试
测试
输入:本
这
输入:输出
出来
进程结束
按任意键继续。。。
(窗口关闭)
python的结尾

这是否回答了您的问题?我已经尝试过使用communicate(),但它不支持多个通信“我可以不断地与它交互”-这意味着什么?@IInspectable就像代码所说的:我有多个输入,我希望将它们依次馈送到子流程,每次都能得到结果谢谢你的努力。“powershell.exe”前面缺少“start”,因为我需要一个单独的窗口。我没有使用p.communicate(),因为我有多个输入。换句话说,我有多个“hello”作为输入,但是“hello1”、“hello2”、“hello3”等,我需要处理它们sequentially@Lin更新了应答器以获得单独的控制台窗口,您可以使用
creationflags=subprocess.CREATE_NEW_CONSOLE
shell=False
(默认值),而不是CMD的内部
start
命令和
shell=True
。无需为此生成cmd.exe进程。此外,无论如何,args列表不应与
shell=True
一起使用,因为子进程不知道如何为cmd.exe正确生成命令行(它不使用
CommandLineToArgvW
规则)。另外,如果脚本的路径最终包含空格,那么使用
start
在这里是错误的,因为
start
将第一个带引号的字符串(在本例中是路径)解释为要使用的窗口标题。