当前位置: 首页 > 面试题库 >

在python脚本中运行powershell脚本,如何使python在运行时打印powershell输出

尉迟越
2023-03-14
问题内容

我正在编写一个python脚本,该脚本可以检查各种条件并相应地运行powershell脚本,以帮助我自动完成从Windows XP到Windows
7的迁移。powershell脚本提供了自己的输出,可让用户了解发生的情况。我想获取powershell脚本的输出并将其打印为python脚本的输出。我环顾了一些问题,这些问题似乎想做同样的事情,但似乎对我没有帮助。最初我尝试使用

import subprocess
subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])

如此处的建议,从Python脚本运行PowerShell功能,但是我发现这等待程序首先执行并且不提供输出,因此我发现我需要subprocess.Popen()按照此处的建议使用Popen在Python中执行Powershell脚本,如何获取Powershell脚本的输出并将其更新到网页?所以我尝试了

import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=sys.stdout)

我得到这个错误

Traceback (most recent call last):
  File "C:\Users\gu2124\Desktop\pstest.py", line 5, in <module>
    subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.py1"], stdout=sys.stdout)
  File "C:\Python27\lib\subprocess.py", line 701, in __init__
    errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
  File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
    c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
  File "<string>", line 523, in __getattr__
  File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 150, in __getattr__
    return syncreq(self, consts.HANDLE_GETATTR, name)
  File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 71, in syncreq
    return conn.sync_request(handler, oid, *args)
  File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 434, in sync_request
    raise obj

AttributeError: DebugOutput instance has no attribute 'fileno'

我不完全确定这是什么意思,但是从阅读AttributeError后我的理解来看:StringIO实例没有属性’fileno’是因为我不正确地使用了stdout。我环顾了四周,发现了这个为什么我的python子进程代码无法正常工作?答案在哪里使用,stdout=subprocess.PIPE所以我尝试了这个

import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)

这也没有给我输出最后我看到了这个http://www.pythonforbeginners.com/os/subprocess-for-system-
administrators
并将我的代码更改为

import subprocess
p = subprocess.Popen(["powershell","C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
print p.communicate

我认为这可能是因为我最初尝试从命令行运行Powershell脚本,所以必须首先打开Powershell。当我直接在命令行中输入这些命令时,它会按照应有的方式工作,但是当我通过python脚本运行时,它会给出

<bound method Popen.communicate of <subprocess.Popen object at 0x00000000026E4A90>>

我想这是一种改进,但并不是我期望的“ Hello world”。我不知道下一步该怎么做才能使它正常工作。任何帮助将不胜感激

另外,如果需要我正在使用的powershell脚本,那就是

$strString = "Hello World"
write-host $strString

function ftest{
$test = "Test"
write-host $test
}

编辑:我试图升级到python 3.3就像在第一个答案中建议的那样,但是我仍然无法使其工作。我使用了命令,p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)并确定文件在那里,但是出现了这个错误:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)
  File "C:\Python27\lib\subprocess.py", line 701, in __init__
    errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
  File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
    c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
UnsupportedOperation: fileno

问题答案:
  1. 确保您可以运行Powershell脚本(默认情况下处于禁用状态)。您可能已经做到了。http://technet.microsoft.com/zh-CN/library/ee176949.aspx

    Set-ExecutionPolicy RemoteSigned
    
  2. 在您的powershell脚本上运行以下python脚本helloworld.py

    # -*- coding: iso-8859-1 -*-
    

    import subprocess, sys

    p = subprocess.Popen([“powershell.exe”,
    “C:\Users\USER\Desktop\helloworld.ps1”],
    stdout=sys.stdout)
    p.communicate()

该代码基于python3.4(或任何3.x系列解释器),尽管它也应在python2.x系列上工作。

C:\Users\MacEwin\Desktop>python helloworld.py
Hello World


 类似资料:
  • 问题内容: 我需要从Python脚本运行PowerShell函数。.ps1和.py文件当前都位于同一目录中。我要调用的函数在PowerShell脚本中。我看到的大多数答案都是关于从Python运行整个PowerShell脚本的。在这种情况下,我试图在Python脚本的PowerShell脚本中运行单个功能。 这是示例PowerShell脚本: 和Python脚本: 因此,我想以某种方式运行Powe

  • 问题内容: 我正在尝试使用Zed A. Shaw的 “ 以 艰难的方式学习Python” 指南来 学习Python的 基础知识。我遇到的问题是我可以运行Python脚本,但只能在名称前面使用。这会瞬间打开CMD,然后关闭。 如果我尝试运行该文件,它将返回该文件不是可操作的程序文件,脚本等。 我已经在Stack Overflow上找到了与此问题相关的多个问题,但是没有一个解决方案对我有用。 我尝试过

  • 问题内容: 我有一个脚本,可以创建网站并动态打印一些数据。-打印的数据应来自另一个python脚本。 我目前面临的问题是,如果我将执行python脚本的行放在执行应用程序的行之前,它将运行Python脚本而不运行;反之亦然。 Python脚本: Flask脚本(注意:价格应为其他脚本的“解析”变量): 问题答案: 使用: 将python脚本(例如)生成的内容包装到函数中。 将其放置在与或相同的目录

  • 问题内容: 我不知道应该把我的Spider代码放在哪里以及如何从main函数中调用它。请帮忙。这是示例代码: 问题答案: 所有其他答案均参考Scrapyv0.x。根据更新的文档,Scrapy 1.0要求:

  • 我有一个 PS 脚本,用于在 Office 365 中创建新用户。我正在使用微软在线和 AzureAD 模块来执行我需要的一切。 我需要从我的Python脚本运行PS脚本,但它不工作,我得到了“未识别的cmdlet”错误。 PS脚本非常基本,它在连接到Msol服务时失败,并继续运行,就像一切正常一样。 我尝试为MSOnline和AzureAD添加导入模块,但没有成功。值得一提的是,该脚本本身确实有

  • 问题内容: 我有一个脚本,每5分钟检查一次PC上的内容,并且我不希望Python显示在任务栏上。我使用Windows作为操作系统。 有什么方法可以让Python在后台运行并强制其不在我的任务栏中显示? 问题答案: 在控制面板中查找计划任务。