使用python编写命令并在powershell中执行

使用python编写命令并在powershell中执行,python,powershell,Python,Powershell,我有一个python脚本,它基于通过rest获得的输入构建命令。 这些命令在打印、复制并粘贴到powershell中时有效。 我的问题是如何让它真正执行命令 到目前为止,我已尝试将命令写入同一目录中的文件,并按如下方式运行: import subprocess, sys p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=sys.stdout) p.communicate() 但我有一个错误: 回溯(最近一次调用上次):文件 “

我有一个python脚本,它基于通过rest获得的输入构建命令。 这些命令在打印、复制并粘贴到powershell中时有效。 我的问题是如何让它真正执行命令

到目前为止,我已尝试将命令写入同一目录中的文件,并按如下方式运行:

import subprocess, sys
p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=sys.stdout)
p.communicate()
但我有一个错误:

回溯(最近一次调用上次):文件 “C:/Users/pschaefer/src/python/executePowerShell.py”,第2行,在 p=subprocess.Popen([“powershell.exe”,“test.ps1”],stdout=sys.stdout)文件“C:\Python27\lib\subprocess.py”, 第703行,在init errread,errwrite),to_close=self._获取_句柄(stdin,stdout,stderr)文件“C:\Python27\lib\subprocess.py”,第850行,在 _得到你的控制 c2pwrite=msvcrt.get_osfhandle(stdout.fileno())不支持操作:fileno

更新

删除
,stdout=sys.stdout1
可以消除前面的错误,现在我明白了

无法加载test.ps1,因为在上已禁用运行\r\n脚本 这个系统

我已尝试将命令切换到
“\\test.ps1 Set ExecutionPolicy-ExecutionPolicy unrestricted”
,但仍然存在此问题


另外,是否可以将命令构建为字符串并在构建时逐个执行,而不是创建.ps1文件?任何人都能明白这一点,这是莫大的荣誉

正在运行脚本的计算机是否已启用运行powershell脚本?您可以通过cmdlet进行设置,也可以传递
-ExecutionPolicy Bypass
参数以降低权限运行脚本。

不支持从IDE运行此类脚本,因为IDE将
stdout
重定向到其自己的流,而该流在大多数情况下都不正确支持
fileno

不过,在真正的系统外壳中运行这些命令是可行的

在shell和IDE中都可以使用的解决方法是删除
stdout=sys.stdout
,但您无法获取错误消息或检索输出,或者更好:使用
Popen
功能重定向输出/错误流:

import subprocess, sys
p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out,err = p.communicate()
print(out,err)
在我的机器上,由于
test.ps1
不存在,我收到一条明确的powershell错误消息


编辑:我的答案不会回答您对问题的编辑,因为现在显示了实际的错误消息。此问答可能会帮助您:

您不需要
stdout=sys.stdout
这是默认设置。您是否仅使用了
os.system()
?或者
subprocess.check_call()
?删除
stdout=sys.stdout
停止了我在python shell中看到的错误,我确实短暂地看到了一个powershell窗口弹出窗口,其中有一个错误,但我无法捕捉到它是什么。关于如何阻止它关闭的任何想法,我可以添加到ps1文件中吗?很抱歉,这里有一个带PowerShell的noob。不要从IDE运行它,请从标准控制台运行它。使用脚本(在python shell中)我可以看到一个错误:“test.ps1无法加载,因为在此系统上禁用了运行脚本。”如果我直接在poweshell中运行脚本,我会看到一个快速弹出窗口,该窗口将消失。如果我只在powershell中运行ps1文件,它会按预期工作,我发现:这可能是有意义的,因为我可以在powershell中直接运行生成的ps1文件而不会出现问题。我已运行Set ExecutionPolicy命令,但仍看到错误“无法加载test.ps1,因为在此系统上禁用了运行\r\n脚本。”尝试运行python脚本时,请尝试将-Executionpolicy旁路标志和.ps1文件名一起传递。注意,我需要在x64和x86版本的PowerShell中运行该命令才能获得它running@PatrickSchaefer这应该没必要,但我很高兴你让它工作了!我猜你第二次更新的shell就是你的程序正在使用的shell。