Udfør bash script fra Python på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive et python script, der vil udføre et bash script, jeg har på min Windows-maskine. Indtil nu har jeg brugt Cygwin-terminalen, så udførelsen af ​​bash-scriptet RunModels.scr har været lige så nemt som ./RunModels.scr. Nu vil jeg kunne bruge subprocess af Python, men fordi Windows ikke har den indbyggede funktionalitet til at klare bash, er jeg ikke sikker på hvad jeg skal gøre.


Jeg forsøger at efterligne ./RunModels.scr < validationInput > validationOutput


Jeg skrev oprindeligt dette:


os.chdir(atm)
vin = open("validationInput", 'r')
vout = open("validationOutput", 'w')
subprocess.call(['./RunModels.scr'], stdin=vin, stdout=vout, shell=True)
vin.close()
vout.close()
os.chdir(home)


Men efter lidt tid at forsøge at finde ud af hvorfor min adgang blev nægtet, indså jeg, at mit problem ikke var filtilladelserne, men det faktum at jeg forsøgte at udføre en bash-fil på Windows generelt. Kan nogen venligst forklare, hvordan man udfører en bash script med rettet input/output på windows ved hjælp af et python script?


Rediger (Opfølgningsproblem) :


Tak for svarene, jeg havde brug for den fulde vej til min bash.exe som den første param. Nu ringer kommandolinjen fra RunModels.scr tilbage i python-udgangen som command not found. For eksempel ls, cp, make. Eventuelle forslag til dette?


Følg op # 2 :
Jeg opdaterede mit opkald til dette:


subprocess.call(['C:\cygwin64\bin\bash.exe', '-l', 'RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\path\dir\_where\_RunModels\')


Fejlen, jeg nu får, er /usr/bin/bash: RunModels.scr: No such file or directory.
Brug af cwd synes ikke at have nogen effekt på denne fejl, på hvilken måde underprocessen ser /usr/bin/bash til RunModels.scr.


SELF-BESVARET
Jeg skulle angive stien til RunModels.scr i opkaldet samt bruge cwd.


subprocess.call(['C:\cygwin64\bin\bash.exe', '-l', 'C:\path\dir\_where\_RunModels\RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\path\dir\_where\_RunModels\')


Men et andet problem ...


Uanset at du angiver cwd, kaster kommandoer udført af RunModels.scr fejl som om RunModels.scr er i den forkerte mappe. Scriptet udføres, men cp og cd kaster fejlen no such file or directory. Hvis jeg navigerer til hvor RunModels.scr er gennem kommandolinjen og udfører den den gammeldags måde, får jeg ikke disse fejl.

Bedste reference


Bare sæt bash.exe i første omgang i din liste over subprocess.call argumenter. Du kan fjerne shell=True, det er ikke nødvendigt i dette tilfælde.


subprocess.call(['C:\cygwin64\bin\bash.exe', '-l', 'RunModels.scr'], 
                 stdin=vin, stdout=vout,
                 cwd='C:\path\dir\_where\_RunModels\')


Afhængigt af hvordan bash er installeret (er det i PATH eller ej), skal du muligvis bruge hele stien til bash-eksekverbar.





Hvad angår det andet spørgsmål, skal du muligvis føje -l til shellindkaldelsen for at sikre, at den læser alle genstart kommandofiler som /etc/profile. Jeg antager, at disse filer indeholder indstillinger for $PATH i bash.


Rediger 2:


Tilføj noget som pwd til begyndelsen af ​​RunModels.scr, så du kan kontrollere, at du er virkelig i det rigtige bibliotek. Kontroller, at der ikke er nogen cd kommando i rc-filer!


Rediger 3:


Fejlen /usr/bin/bash: RunModels.scr: No such file or directory kan også genereres, hvis bash ikke kan finde en af ​​de kommandoer, der kaldes i scriptet. Prøv at tilføje -v mulighed for at bash for at se, om det giver mere info.