Frage Powershell-Skript im Python-Skript ausführen, wie python die Powershell-Ausgabe drucken kann, während sie ausgeführt wird


Ich schreibe ein Python-Skript, das verschiedene Bedingungen überprüft und ein Powershell-Skript entsprechend ausführt, um mir die Migration von Windows XP zu Windows 7 zu automatisieren. Das Powershell-Skript gibt seine eigene Ausgabe, die dem Benutzer Updates gibt, was passiert. Ich möchte die Ausgabe des Powershell-Skripts nehmen und es als Ausgabe des Python-Skripts ausgeben. Ich habe mir einige Fragen angeschaut, die scheinbar dasselbe tun wollen, aber sie scheinen nicht für mich zu arbeiten. Anfangs versuchte ich es zu benutzen

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

Wie hier vorgeschlagen wurde Führen Sie die PowerShell-Funktion aus dem Python-Skript aus aber ich fand heraus, dass dies darauf wartet, dass das Programm zuerst ausgeführt wird und keine Ausgabe gibt, also habe ich herausgefunden, dass ich es benutzen muss subprocess.Popen() wie hier vorgeschlagen wurde Verwenden Sie Popen, um ein Powershell-Skript in Python auszuführen, wie kann ich die Ausgabe des Powershell-Skripts abrufen und auf der Webseite aktualisieren? also habe ich das versucht

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

und ich bekomme diesen Fehler

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'

Ich bin mir nicht ganz sicher, was das bedeutet, aber von dem, was ich denke, verstehe ich nach dem Lesen AttributeError: StringIO-Instanz hat kein Attribut 'fileno' liegt daran, dass es daran liegt, dass ich mit dem stdout falsch herumspiele. Ich schaute mich mehr um und ich fand das Warum funktioniert mein Python-Subprozesscode nicht? wo die Antworten sagten zu verwenden stdout=subprocess.PIPE also habe ich das versucht

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

Das gibt mir auch keine Ausgabe Endlich sah ich das http://www.pythonforbeginners.com/os/subprocess-for-system-administrators und habe meinen Code dahingehend geändert

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

Ich dachte, dass dies möglicherweise der Fall ist, weil ich zunächst versuche, ein Powershell-Skript über die Befehlszeile auszuführen, sodass ich zuerst die Powershell öffnen muss. Wenn ich diese Befehle direkt in die Befehlszeile eingabe, funktioniert es so, wie es sollte, aber wenn ich es durch das Python-Skript führe, gibt es das

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

was eine Verbesserung ist, denke ich, aber nicht die "Hallo Welt", die ich erwartet habe. Ich habe keine Ahnung, was ich als nächstes tun sollte, um das zur Arbeit zu bringen. Jede Hilfe würde sehr geschätzt werden

Auch wenn das Powershell-Skript, das ich verwende, benötigt wird, ist es hier

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

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

EDIT: Ich habe versucht, auf Python 3.3 zu aktualisieren, wie es in der ersten Antwort vorgeschlagen wurde, aber ich kann es immer noch nicht zum Laufen bringen. Ich habe den Befehl benutzt p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout) und bin mir sicher, dass die Datei da ist, aber ich bekomme diesen Fehler:

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 

5
2018-02-21 20:50


Ursprung


Antworten:


  1. Stellen Sie sicher, dass Sie Powershell-Skripts ausführen können (standardmäßig deaktiviert). Wahrscheinlich hast du das schon getan. http://technet.microsoft.com/en-us/library/ee176949.aspx

    Set-ExecutionPolicy RemoteSigned
    
  2. Führen Sie dieses Python-Skript in Ihrem Powershell-Skript aus 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()
    

Dieser Code basiert auf python3.4 (oder einem Interpreter der 3.x-Reihe), sollte aber auch auf der python2.x-Reihe funktionieren.

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

11
2017-08-15 20:17



Ich habe Python 2.7 nicht installiert, aber in Python 3.3 Popen mit stdout einstellen sys.stdout hat gut funktioniert. Nicht bevor ich den Backslashes im Weg entkommen war.

>>> Teilprozess importieren
>>> System importieren
>>> p = subprocess.Popen (['powershell.exe', 'C: \\ Temp \\ test.ps1'], stdout = sys.stdout)
>>> Hello World
_

1
2018-02-21 21:23