2011-08-01 422 views
13

Estoy tratando de iniciar una secuencia de comandos PowerShell desde pitón de esta manera:Invocación de un script de PowerShell desde Python

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', 
          './buildxml.ps1', 
          arg1, arg2, arg3], cwd=os.getcwd()) 
result = psxmlgen.wait() 

El problema es que me sale el siguiente error:

File C:\Users\sztomi\workspace\myproject\buildxml.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.

a pesar del hecho que habilité la ejecución de scripts en Powershell hace mucho tiempo al escribir Set-ExecutionPolicy Unrestriced en una terminal PS administrada por el administrador (y lo hice de nuevo, solo para estar seguro). El ejecutable de PowerShell es el mismo al que apunta el acceso directo en el menú de inicio. Get-ExecutionPolicy informa correctamente Unrestricted sin importar si ejecuté PowerShell como administrador o no.

¿Cómo puedo ejecutar correctamente un script de PS desde Python?

Respuesta

15

Primero, Set-ExecutionPolicy Unrestriced es por usuario y por bitios (32 bits es diferente de 64 bits).

En segundo lugar, puede anular la política de ejecución desde la línea de comandos.

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', 
          '-ExecutionPolicy', 
          'Unrestricted', 
          './buildxml.ps1', 
          arg1, arg2, arg3], cwd=os.getcwd()) 
result = psxmlgen.wait() 

Aparentemente se puede acceder a la PowerShell de 64 bits de PowerShell de 32 bits con este camino (gracias a @eryksun en los comentarios):

powershell64 = os.path.join(os.environ['SystemRoot'], 
    'SysNative' if platform.architecture()[0] == '32bit' else 'System32', 
    'WindowsPowerShell', 'v1.0', 'powershell.exe') 
+2

¡Qué bueno, gracias! En realidad, descubrí que el problema se debía al infame redireccionamiento del sistema de archivos de Windows 7 x64. (Tuve una política Sin restricciones en la versión x64, pero no en la x86, y Python no fue redirigido a ella). –

+0

No estoy del todo seguro de cómo llamar a un ejecutable así con subproceso, pero solo para aclarar, ¿es el './buildxml.ps1' el comando real que se está llamando? –

+0

@ alguien-or-otro buildxml.ps1 es un archivo de comandos de powershell y el ejecutable (si eso es lo que quiere decir con el comando) es ''C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe''. Todos los elementos en la lista que siguen son parámetros que se pasan a este ejecutable. –

0

Para aquellos de nosotros que quería saber cómo muestra los valores de arg1, arg2 y arg3 después de pasarlos a powershell, todo lo que necesitas hacer es:

Write-Host $args[0] 
Write-Host $args[1] 
Write-Host $args[2] 
Cuestiones relacionadas