【问题标题】:Write commands with python and execute in powershell用python编写命令并在powershell中执行
【发布时间】:2017-09-08 18:55:20
【问题描述】:

我有一个 python 脚本,它根据通过休息获得的输入构建命令。 这些命令在打印出来并复制并粘贴到 powershell 时起作用。 我的问题是如何让它真正执行命令?

到目前为止,我已经尝试将命令写入同一目录中的文件并像这样运行:

import subprocess, sys
p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=sys.stdout)
p.communicate()

但我得到一个错误:

Traceback(最近一次调用最后一次):文件 “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._get_handles(stdin, stdout, stderr) 文件“C:\Python27\lib\subprocess.py”,第 850 行,在 _get_handles c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) UnsupportedOperation: fileno

更新

删除,stdout=sys.stdout1 摆脱了以前的错误,现在我明白了

test.ps1 无法加载,因为运行 \r\nscripts 被禁用 这个系统。

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

另外,是否可以将命令构建为字符串并在构建时一一执行,而不是创建一个 .ps1 文件?非常感谢任何能解决这个问题的人!

【问题讨论】:

  • 你不需要stdout=sys.stdout 这是默认的。您是否尝试过仅使用 os.system() ?或subprocess.check_call() ?
  • 啊删除stdout=sys.stdout 停止了我在python shell 中看到的错误,我确实简要地看到了一个看起来像是powershell 窗口弹出的错误,但我无法理解它是什么。关于如何阻止它关闭我可以添加到 ps1 文件的任何想法?抱歉,这里绝对是一个使用 powershell 的菜鸟
  • 不要从你的 IDE 运行它,从标准控制台运行它

标签: python powershell


【解决方案1】:

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

【讨论】:

  • 这可能有点问题,因为我可以直接在 powershell 中运行生成的 ps1 文件而不会出现问题。我已经运行了 Set-ExecutionPolicy 命令,但我仍然看到错误“无法加载 test.ps1,因为在此系统上禁用了运行 \r\nscripts。”尝试运行 python 脚本时
  • 尝试将 -Executionpolicy Bypass 标志与您的 .ps1 文件名一起传递
  • 请注意,我需要在 x64 和 x86 版本的 PowerShell 中运行该命令才能使其运行
  • @PatrickSchaefer 这不应该是必要的,但我很高兴你让它工作了!我猜你第二次更新的那个 shell 就是你的程序正在使用的那个。
【解决方案2】:

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

不过,在真实的系统 shell 中运行这些命令是可行的。

适用于 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 错误消息。

编辑:我的回答没有回答您对问题的编辑,它现在显示实际的错误消息。本问答可能对您有所帮助:PowerShell says "execution of scripts is disabled on this system."

【讨论】:

  • 所以使用你的脚本(在 python shell 中)我可以看到一个错误:“test.ps1 无法加载,因为在这个系统上运行 \r\nscripts 被禁用。”如果我直接在 poweshell 中运行脚本,我会看到一个消失的快速弹出窗口。如果我只在 powershell 中运行 ps1 文件,它会按预期工作,想法?
猜你喜欢
  • 2018-12-24
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多