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'问题

有没有办法从 Powershell 抑制所有命令行输出,包括错误

使用python的putty登录时无法设置标题。

python os.popen 出错