从Python程序中运行PowerShell脚本

Windows PowerShell由几十个内置的cmdlet组成,它们提供了丰富的功能集。其中有些功能是独一无二的,只有通过PowerShell才能实现;因此,如果我们能在其他编程语言(如Python)中使用PowerShell脚本,那就非常有用了。

本文将重点介绍从Python代码中执行PowerShell逻辑。

Pythonsubprocess.Popen() 方法

在Python中,外部程序可以使用subprocess.Popen() 方法执行。subprocess 模块由几个比旧的os 模块中的方法更有效的方法组成;因此,建议使用subprocess 模块而不是os 模块。

由于我们将从Python程序中运行PowerShell代码,最方便的方法是使用subprocess 模块中的Popen 类。它创建一个单独的子进程来执行外部程序。

需要记住的一点是,这个进程是与平台有关的。

每当你调用subprocess.Popen() ,就会调用Popen 的构造函数。它接受多个参数,如下图所示。

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

参数args ,用于传递启动外部程序的命令。你可以用两种方式传递命令及其参数。

  1. 作为一个参数序列

    Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
    
  2. 作为一个单一的命令字符串

    Popen('path_to_external_program_executable -command_param1 arg1 -command_param2 arg2 ...')
    

参数序列推荐使用Popen 构造函数。

下一个重要的参数是stdout ,我们将在下一节中使用这个参数。这指定了进程应该使用的标准输出。

使用Popen() 方法从Python程序中运行PowerShell脚本

首先,创建一个简单的PowerShell脚本,打印到控制台窗口。

Write-Host 'Hello, World!'

我们将把它保存为sayhello.ps1

接下来,我们将创建一个Python脚本,runpsinshell.py 。由于我们将使用subprocess.Popen() 命令,我们必须先导入subprocess 模块。

import subprocess

然后我们将用argsstdout 参数调用Popen 构造函数,如下图所示。

p = subprocess.Popen(["powershell.exe", "D:\codes\sayhello.ps1"], stdout=sys.stdout)

正如你所看到的,参数被作为一个序列传递,这是推荐的方式。第一个参数是外部程序的可执行名称,接下来是先前创建的PowerShell脚本的文件路径。

另一件需要记住的重要事情是,我们应该把标准输出参数指定为sys.stdout 。为了在你的Python程序中使用sys.stdout ,我们还必须导入sys 模块。

最后的程序应该如下。

import subprocess, sys
p = subprocess.Popen(["powershell.exe", "D:\codes\sayhello.ps1"], stdout=sys.stdout)
p.communicate()

最后,让我们运行Python程序,如下所示。

python .runpsinshell.py

输出:

从Python程序中运行PowerShell脚本

正如预期的那样,PowerShell脚本已经从Python代码中执行,并将Hello, World! 字符串打印到PowerShell窗口中。

该Python程序也可以通过将Popen 构造函数参数作为单个字符串来编写。

import subprocess, sys
p = subprocess.Popen('powershell.exe -ExecutionPolicy RemoteSigned -file 	 "D:\codes\sayhello.ps1"', stdout=sys.stdout)
p.communicate()