[Python]Onverwachte returncode van subprocess

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Ik heb het volgende stukje code:

Python:
1
2
3
4
5
6
7
8
    compare_process = subprocess.Popen(['diff', results_filename, reference_filename], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
    stdout = compare_process.communicate()[0]
    rc = compare_process.returncode
    print rc         # show rc to see if this is correct, unlike the stdout
    if len(stdout) == 0:
      str = str + "PASSED"
    else:
      str = str + "FAILED"


Het moet 2 teksttfiles vergelijken en aangeven of ze wel of niet gelijk zijn. Hiervoor wordt een subproces gestart om zo het diff commando te gebuiken.

De code werkt indien beide files bestaan, maar indien 1 van beide files niet bestaat wordt dat gezien alsof de files gelijk zijn.

Ik had eigenlijk verwacht dat ik dan een errormelding in de stdout string zou krijgen (stderr wordt omgeleid naar stdout). Ook heb ik de return code geprobeerd: bij een fout zou een returncode van 2 of hoger moeten terugkomen (volgens de documentatie van het diff commando). Echter: indien 1 van de 2 files niet bestaat, krijg ik 0 terug: dat is de code voor het geval dat beide files gelijk zijn.Bij 2 ongelijke files krijg ik netjes de correcte returncode 1 terug.

Als ik stderr ook via een PIPE laat lopen en stderr afvraag, is deze in het geval van een niet bestaande file gewoon leeg. Ik had daar eigenlijk een foutmelding verwacht, die je ook krijgt als je het diff commando gewoon vanaf de CLI uitvoert.

Wat zie ik hier over het hoofd?

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!

Alle reacties


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 12:58
EXX schreef op donderdag 31 oktober 2019 @ 09:03:

[...]

Het moet 2 teksttfiles vergelijken en aangeven of ze wel of niet gelijk zijn. Hiervoor wordt een subproces gestart om zo het diff commando te gebuiken.

De code werkt indien beide files bestaan, maar indien 1 van beide files niet bestaat wordt dat gezien alsof de files gelijk zijn.

[...]
Zonder in te gaan wat je fout doet met de comando, kan je niet in Python simpelweg checken of de files bestaan en op die manier afvangen?

Als je het perse wilt doen via alleen de subprocess, controlleer met command line (Bash, Cmd, Powershell of whatever) of hij het daar wel goed doet. Wie weet dat je een stukje code over het hoofd ziet in Python.

Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Ik kan natuurlijk wel van te voren controleren of beide files bestaan, maar daar vang je alleen maar dat specifieke foutgeval mee af. Ik wil eigenlijk dat ik alle foutgevallen op een hoop kan gooien en markeren kan als 'diff is fout gegaan'. Dat is voldoende voor mij.

Vanaf de CLI (bash) krijg je netjes een foutmelding van diff dat een file niet gevonden is:

diff: <filename>: No such file or directory

edit:
Even getest met een kort bash script :

Bash:
1
2
3
#!/bin/bash
diff filename1 filename2
echo $?

Dit geeft 0 indien de files gelijk zijn, 1 als ze niet gelijk zijn, en 2 bij het geval dat een file niet bestaat. Bovendien zie ik dan ook de foutmelding

edit2:
Het wordt nog vreemder. Als ik een fout forceer door in de Popen call 1 filenaam weg te halen (en dus maar 1 file als parameter meegeef aan diff) krijg ik wel correcte output in stderr, en is de return code 2. Waarom dan niet als 1 file niet bestaat :?

[ Voor 41% gewijzigd door EXX op 31-10-2019 10:26 ]

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!


Acties:
  • 0 Henk 'm!

  • martyw
  • Registratie: Januari 2018
  • Laatst online: 13:28
Heb je al naar difflib gekeken? In samenwerking met os.path.isfile moet je een eind kunnen komen.

Acties:
  • 0 Henk 'm!

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 03-10 16:41

EXX

EXtended eXchange

Topicstarter
Opgelost.

Het probleem zat helemaal niet in dit stuk code, maar in een heel ander deel. Een lang verhaal maar het komt er op neer dat de code die de filenamen construeert een copy/paste error had waardoor er steeds dezelfde (bestaande) filenaam uitkwam.

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!