【发布时间】:2015-03-20 10:40:09
【问题描述】:
我正在尝试编写一个 Python 程序,该程序将打开一个 powershell 进程,然后在将命令传递给它并获取输出时保持打开状态。我不想为每个命令打开一个新的 powershell 进程,因为 powershell 会话必须通过远程系统进行身份验证,并且我不想对每个命令都不断地经历非超快速的身份验证过程。
发生的情况是,powershell 进程正在接管并阻止 Python 代码的继续执行……一旦 powershell 进程启动,Python 进程就会停止并等待它退出。显然这不好,因为一旦 powershell 启动,我就无法向它传递任何命令。
我的代码的相关部分是:
import subprocess as sp
def _open_powershell_session():
ps_path = r"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
azure_path = r"C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\ShortcutStartup.ps1"
flags = ["-NoExit", "-ExecutionPolicy", "Bypass", "-File"]
launch_str = [ps_path] + flags + [azure_path]
ps_session = sp.Popen(args=launch_str, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
return ps_session
我做错了什么?
【问题讨论】:
-
您不需要 PowerShell.exe 进程,您需要 PowerShell 对象。我认为你不能像这样使用可执行文件,除非你按下按键并抓取屏幕输出。
-
所以你告诉我打开一个进程并让 Python 将数据传递给标准输入,然后保持该进程打开以供 Python 程序未来的标准输入调用的概念是不可能的?在我看来,这将是一个非常基本的用例......打开一个进程,然后与它来回通信。
-
我不知道一般情况下这是不可能的,只是我认为您不能那样使用 PowerShell.exe 可执行文件。
-
啊,我明白了.. 但为什么会这样呢?它是一个控制台应用程序,因此它应该接受来自标准输入的输入。 powershell 在某些方面是独一无二的吗?
-
尝试将
shell=True添加到Popen的参数中
标签: python powershell subprocess popen