2011-08-01 13 views
13

Je suis en train de lancer un script PowerShell de python comme ceci:un script PowerShell Invoquer de Python

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

Le problème est que je reçois l'erreur suivante:

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.

MALGRÉ le fait que j'ai activé l'exécution de scripts dans Powershell il y a longtemps en tapant Set-ExecutionPolicy Unrestriced dans un terminal PS géré par l'administrateur (et l'ai fait à nouveau, juste pour être sûr). L'exécutable powershell est le même que le raccourci dans le menu Démarrer pointe vers. Get-ExecutionPolicy rapports correctement Unrestricted peu importe si j'ai couru PowerShell comme administrateur ou non.

Comment puis-je exécuter un script PS correctement à partir de Python?

Répondre

15

Premièrement, Set-ExecutionPolicy Unrestriced est basé sur l'utilisateur, et par bitness (32 bits est différent de 64 bits). Deuxièmement, vous pouvez remplacer la politique d'exécution à partir de la ligne de commande.

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() 

Apparemment, vous pouvez accéder à l'PowerShell 64 bits de PowerShell 32 bits avec ce chemin (grâce à @eryksun dans les commentaires):

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

Wow qui est génial, merci! En fait, je viens de comprendre que le problème était dû à l'infâme système de fichiers-redirection de Windows 7 x64. (J'avais une politique non restreinte dans la version x64, mais pas dans la x86, et python n'était pas redirigé vers celle-ci). –

+0

Je ne suis pas entièrement sûr de savoir comment appeler un exécutable comme celui-ci avec un sous-processus, mais juste pour clarifier, est-ce que le './buildxml.ps1' est la commande réelle qui est appelée? –

+0

@ quelqu'un-ou-autre buildxml.ps1 est un fichier de script powershell et l'exécutable (si c'est ce que vous voulez dire par commande) est '' C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe''. Tous les éléments de la liste qui suivent sont des paramètres qui sont passés à cet exécutable. –

0

Pour ceux d'entre nous qui voulait savoir afficher les valeurs de arg1, arg2 et arg3 après avoir été passé à Powershell, tout ce que vous devez faire est:

Write-Host $args[0] 
Write-Host $args[1] 
Write-Host $args[2] 
Questions connexes