scripts script para guardar ejemplo ejecutar ejecutable desde crear como python windows python-2.7 powershell stdout

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 _


  1. 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

  2. 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