从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
,用于传递启动外部程序的命令。你可以用两种方式传递命令及其参数。
-
作为一个参数序列
Popen(["path_to_external_program_executable", "command_args1", "command_args2", ...])
-
作为一个单一的命令字符串
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
然后我们将用args
和stdout
参数调用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
输出:
正如预期的那样,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()