Avatar billede blaz3r Nybegynder
11. februar 2011 - 16:37 Der er 5 kommentarer og
1 løsning

Subprocess python læs output løbende

Hvis jeg nu f.eks. har en fil bestående af:

import time
print 'Starting print in test3.py'
time.sleep(3)
print 'Ending print in test3.py'


og en anden fil bestående af nedenstående, som altså kalder ovenstående fil:

import time
import subprocess
print 'Sending process to test3'
process = subprocess.Popen(['python', 'test3.py'], stdout=subprocess.PIPE)
print process.communicate()[0]
print 'Done with it all...'


Så ville jeg godt at når man kørte "python test.py" (som filen ovenfor hedder) så ville den printe:
Sending process to test3
direkte efterfulgt af
Starting print in test3.py

Men i stedet venter programmet på at filen bliver færdig, altså efter sleep'et, og returnerer hele printet, før programmet altså returnerer og der printes noget hos den kaldende fil. Jeg har google meget og fundet flere forslag, men intet virker når jeg prøver at implementere det. Nogen der kan hjælpe?

På forhånd tak.
Avatar billede HBP2 Praktikant
13. februar 2011 - 17:26 #1
Jeg tror ikke det er muligt at kommunikere på den måde via stdout.

Hvis du istedet bruger stderr, så virker det. Erstat

print process.communicate()[0]
med
print process.communicate()[1]

og skriv til stderr med

sys.stderr.write('Starting print in test3.py')
Avatar billede blaz3r Nybegynder
13. februar 2011 - 17:36 #2
Tak skal du have.

Kan se det virker, men hvis jeg prøver at læse process.communicate()[1] ind i en variabel til senere print, kan dette ikke lade sig gøre. Jeg ville gerne hvis jeg kunne fange det som nu korrekt printes, da jeg kun skal bruge noget af dataen i det faktiske program jeg ønsker at lave.

Ved du noget om det?
Avatar billede HBP2 Praktikant
13. februar 2011 - 18:17 #3
Jeg kan ikke se hvorfor det ikke skulle virke - dette virker her:

data = process.communicate()[1]
print data
Avatar billede HBP2 Praktikant
13. februar 2011 - 18:21 #4
Hov - jeg glemte at skrive at Popen() naturligvis skal inkludere stderr=subprocess.PIPE som argument.
Avatar billede HBP2 Praktikant
13. februar 2011 - 19:44 #5
Hov - ovenstående virker ikke - det ser bare sådan ud fordi stderr ryger direkte ud til skærmen. Hvis du ikke på dokumentationen for communicate() så står der at communicate() venter til child-processen stopper, jeg tror det betyder at der ikke kommer noget data før test3.py stopper.

Der er nogle lovende eksempler her:
http://stackoverflow.com/questions/375427/non-blocking-read-on-a-stream-in-python
Avatar billede bauerdata Nybegynder
04. juli 2011 - 11:32 #6
python bufrer default outpu.
for at slå dette fra så start python med option -u
eller sæt environment variablen
PYTHONUNBUFFERED
  Hvis den er sat til en ikke tom staring svarer det til at python er kaldt med option -u
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester