2011-08-01 30 views
13

Próbuję uruchomić skrypt PowerShell z pytona takiego:Wywoływanie skryptu PowerShell z Pythonem

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

Problemem jest to, że pojawia się następujący błąd:

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.

pomimo faktu, że umożliwiłem uruchamianie skryptów w Powershell dawno temu, wpisując Set-ExecutionPolicy Unrestriced w uruchamianym przez administratora terminalu PS (i zrobiłem to ponownie, aby się upewnić). Plik wykonywalny powershell jest taki sam, jak wskazuje skrót w menu start. Get-ExecutionPolicy poprawnie zgłasza Unrestricted, niezależnie od tego, czy uruchomiłem PowerShell jako administrator, czy nie.

Jak mogę poprawnie wykonać skrypt PS z Pythona?

Odpowiedz

15

Po pierwsze, Set-ExecutionPolicy Unrestriced jest dla każdego użytkownika i dla każdej bazy (32-bitowy jest inny niż 64-bitowy).

Po drugie, można nadpisać zasady wykonania z wiersza poleceń.

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

Podobno można uzyskać dostęp do PowerShell 64-bitowego z 32-bitowym PowerShell z tej ścieżki (dzięki @eryksun w komentarzach):

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

Wow, to świetnie, dziękuję! Właściwie to właśnie odkryłem, że problem spowodowany jest niesławnym przekierowaniem systemu plików Windows 7 x64. (Miałem nieograniczoną politykę w wersji x64, ale nie w x86, a python nie był przekierowywany na to). –

+0

Nie jestem do końca pewien, jak wywołać taki plik wykonywalny z podprocesu, ale aby wyjaśnić, jest "./buildxml.ps1" faktyczne polecenie, które jest wywoływane? –

+0

@ ktoś-lub-inny buildxml.ps1 to plik skryptowy typu powershell, a plik wykonywalny (jeśli to właśnie masz na myśli przy komendzie) to "C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe". Wszystkie pozycje na poniższej liście są parametrami, które są przekazywane do tego pliku wykonywalnego. –

0

Dla tych z nas, którzy chcieli wiedzieć, w jaki sposób wyświetlaj wartości arg1, arg2 i arg3 po przekazaniu do powershell, wszystko co musisz zrobić to:

Write-Host $args[0] 
Write-Host $args[1] 
Write-Host $args[2] 
Powiązane problemy