para - Ejecutar el script de powershell dentro del script de python, cómo hacer que python imprima el resultado de PowerShell mientras se ejecuta
script python windows (2)
Estoy escribiendo un script de python que verifica varias condiciones y ejecuta un script de PowerShell para ayudarme a automatizar la migración desde Windows XP a Windows 7. El script de PowerShell proporciona su propio resultado y le informa al usuario sobre lo que está sucediendo. Me gustaría tomar el resultado del script de powershell e imprimirlo como salida del script de python. He observado algunas preguntas que parecen querer hacer lo mismo, pero no parecen funcionar para mí. Inicialmente traté de usar
import subprocess
subprocess.call(["C:/Users/gu2124/Desktop/helloworld.ps1"])
Como se sugirió aquí, ejecute la función de PowerShell desde el script de Python, pero descubrí que esto espera que el programa se ejecute primero y no da salida, así que descubrí que necesito usar el subprocess.Popen()
como se sugirió aquí. Use Popen para ejecutar un Script de Powershell en Python, ¿cómo puedo obtener el resultado del script de Powershell y actualizarlo a la página web? así que probé esto
import subprocess
subprocess.Popen(["C:/Users/gu2124/Desktop/helloworld.ps1"], stdout=sys.stdout)
y obtengo este error
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''
No estoy completamente seguro de lo que esto significa, pero de lo que creo que entiendo después de leer este AttributeError: la instancia de StringIO no tiene ningún atributo ''fileno'' porque es porque estoy jugando con el stdout incorrectamente. Miré más y encontré esto ¿Por qué no funcionará mi código de subproceso python? donde las respuestas dicen usar stdout=subprocess.PIPE
así que probé esto
import subprocess
subprocess.Popen(["C:/Users/gu2124/Desktop/helloworld.ps1"], stdout=subprocess.PIPE)
que tampoco me da salida. Finalmente vi este http://www.pythonforbeginners.com/os/subprocess-for-system-administrators y cambié mi código a este
import subprocess
p = subprocess.Popen(["powershell","C:/Users/gu2124/Desktop/helloworld.ps1"], stdout=subprocess.PIPE)
print p.communicate
Pensé que podría ser porque inicialmente estoy tratando de ejecutar un script de PowerShell desde la línea de comandos, así que primero tengo que abrir PowerShell. Cuando escribo estos comandos directamente en la línea de comandos, funciona de la manera que debería, pero cuando lo ejecuto a través del script de python me da esto.
<bound method Popen.communicate of <subprocess.Popen object at 0x00000000026E4A90>>
que es una mejora, supongo, pero no el "Hola mundo" que esperaba. No tengo idea de lo que debería intentar hacer a continuación para que esto funcione. Cualquier ayuda sería muy apreciada
Además, si el script de powershell que estoy usando es necesario aquí, es
$strString = "Hello World"
write-host $strString
function ftest{
$test = "Test"
write-host $test
}
EDITAR: Intenté actualizar a Python 3.3 como se sugirió en la primera respuesta, pero todavía no puedo hacer que funcione. p = subprocess.Popen([''powershell.exe'', "C://Users//gu2124//Desktop//helloworld.ps1"], stdout=sys.stdout)
el comando p = subprocess.Popen([''powershell.exe'', "C://Users//gu2124//Desktop//helloworld.ps1"], stdout=sys.stdout)
y estoy seguro de que el archivo está allí pero estoy obteniendo este error:
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
No tengo instalado Python 2.7, pero en Python 3.3 llamar a Popen
con el conjunto de stdout
a sys.stdout
funcionó bien. No obstante, antes de que hubiera escapado de las barras invertidas en el camino.
>>> import subprocess
>>> import sys
>>> p = subprocess.Popen([''powershell.exe'', ''C://Temp//test.ps1''], stdout=sys.stdout)
>>> Hello World
_
Asegúrese de que puede ejecutar scripts de PowerShell (está deshabilitado de forma predeterminada). Es probable que ya hayas hecho esto. http://technet.microsoft.com/en-us/library/ee176949.aspx
Set-ExecutionPolicy RemoteSigned
Ejecute este script python en su script de powershell
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()
Este código está basado en python3.4 (o cualquier intérprete de la serie 3.x), aunque debería funcionar en la serie python2.x también.
C:/Users/MacEwin/Desktop>python helloworld.py
Hello World