问题描述
我正在尝试从 python 启动一个 PowerShell 脚本,如下所示:
I'm trying to start a PowerShell script from python like this:
psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
'./buildxml.ps1',
arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()
问题是我收到以下错误:
The problem is that I get the following error:
文件C:\Users\sztomi\workspace\myproject\buildxml.ps1无法加载,因为在此上禁用了脚本的执行系统.有关详细信息,请参阅get-help about_signing".
尽管我很久以前确实通过在管理员运行的 PS 终端中键入 Set-ExecutionPolicy Unrestricted
启用了在 Powershell 中运行脚本的事实(并且再次这样做,只是为了确保).powershell 可执行文件与开始菜单中的快捷方式指向的相同.无论我是否以管理员身份运行 PowerShell,Get-ExecutionPolicy
都会正确报告 Unrestricted
.
DESPITE the fact that I did enable running scripts in Powershell a long time ago by typing Set-ExecutionPolicy Unrestriced
in an administrator-ran PS terminal (and did again, just to make sure). The powershell executable is the same that the shortcut in start menu points to. Get-ExecutionPolicy
correctly reports Unrestricted
no matter if I ran PowerShell as admin or not.
如何从 Python 正确执行 PS 脚本?
How can I execute a PS script correctly from Python?
推荐答案
首先,Set-ExecutionPolicy Unrestricted
是基于每个用户的,基于每个比特的(32 位不同于 64-位).
First, Set-ExecutionPolicy Unrestriced
is on a per user basis, and a per bitness basis (32-bit is different than 64-bit).
其次,您可以从命令行覆盖执行策略.
Second, you can override the execution policy from the command line.
psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
'-ExecutionPolicy',
'Unrestricted',
'./buildxml.ps1',
arg1, arg2, arg3], cwd=os.getcwd())
result = psxmlgen.wait()
显然,您可以使用此路径从 32 位 PowerShell 访问 64 位 PowerShell(感谢@eryksun 在评论中):
Apparently you can access the 64-bit PowerShell from 32-bit PowerShell with this path (thanks to @eryksun in comments):
powershell64 = os.path.join(os.environ['SystemRoot'],
'SysNative' if platform.architecture()[0] == '32bit' else 'System32',
'WindowsPowerShell', 'v1.0', 'powershell.exe')
这篇关于从 Python 调用 PowerShell 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!