windows - Kan ikke få afgangskode, når du kører underprocesser i python ved hjælp af Popen og start/vent

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette et python-script, der starter et nyt vindue og venter på, at det er færdigt, og hent derefter udgangskoden. Så jeg bruger Popen med start /wait for at oprette et separat vindue til det, men det gør det Udfyld ikke udgangskoden korrekt.


Denne kode opsummerer problemet:


import subprocess

params = {}
params['stdout'] = subprocess.PIPE
params['stderr'] = subprocess.PIPE
params['shell'] = True

proc = subprocess.Popen('start /wait cmd /c exit 1', **params)

# This works but the above line does not
#proc = subprocess.Popen('exit 1', **params)

resultCode = proc.wait()

print(resultCode)


Dokumentationen for start /wait tyder på, at den skal returnere exitkoden, og når jeg kører det manuelt og derefter tjekker \%ERRORLEVEL\%, vises det korrekt, så jeg er ikke sikker på, hvad jeg gør galt

Bedste reference


CMD 's start kommando lykkes altid generelt, hvis det med succes udfører den givne kommando via CreateProcess eller ShellExecuteEx. Det lykkes selvom det bliver instrueret til /wait og ender med at indstille \%errorlevel\% til en ikke-nul værdi. Du kan se dette ved at køre (start /wait exit 1) && echo success. Operatøren && udfører kun den højre udtryk, hvis venstre udtryk lykkes.


For at omgå dette kan du manuelt afslutte den oprindelige skal ved hjælp af værdien !errorlevel!, der indstilles af start. For eksempel:


command = 'exit 1'
shell\_path = os.environ.get('ComSpec', 'cmd.exe')
start\_command = 'start "" /wait {}'.format(command)
cmdline = '"{shell}" /v:on /c "({command}) & exit !errorlevel!"'.format(
          shell=shell\_path, command=start\_command)

proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess=PIPE)


Bemærk, at ovenstående Popen opkald ikke bruger argumentet shell=True, fordi skalen skal køres manuelt med indstillingen /v:on. Dette muliggør forsinket udvidelse af miljøvariabler ved hjælp af '!' i stedet for '\%'.


Når det er sagt, behøver du ikke skalen til dit angivne mål. Bare have børneprocessen oprette en ny konsol ved at sende CREATE\_NEW\_CONSOLE skabelsesflagg som følger:


proc = subprocess.Popen(args, creationflags=subprocess.CREATE\_NEW\_CONSOLE,
           stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Andre referencer 1


Ved brug af


proc = subprocess.Popen('call cmd /c exit 1', **params)


I stedet for din start /wait returneres fejlkoden 1 i resultCode.


Ved logikken til dette spørgsmål og svar: CALL-kommando vs START med/WAIT indstilling


Mit gæt ville være, at forskellen er, at start /wait ikke deler variable med samme miljø og call gør.