Python、Powershell 和 Popen
Posted
技术标签:
【中文标题】Python、Powershell 和 Popen【英文标题】:Python, Powershell, and Popen 【发布时间】: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
的参数中
【参考方案1】:
看看 Twisted:https://twistedmatrix.com/documents/14.0.0/core/howto/process.html
我没有将它用于 PowerShell.exe,但它完全改变了我与子进程交互的方式。
【讨论】:
以上是关于Python、Powershell 和 Popen的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 中的参数运行 PowerShell 脚本
解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题
解决subprocess.Popen在windows下执行命令报的KeyError: 'PATH'问题