Rückgabewert an Konsole

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
harald
User
Beiträge: 18
Registriert: Freitag 16. August 2013, 09:10

Hi
Ich rufe auf einer Linux Shell heraus ein Python Program auf und würde gerne einen Rückgabewert an die Shell übergeben und mit diesen Weiterarbeiten. Leider wird in die Variable SRC_DIR_ nichts hineingeschrieben und wenn vermutlich der Rückgabewert von python3. Gibt es eine Möglichkeit den Rückgabewert OK in die Variable in der Shell zu schreiben? DANKE

Code: Alles auswählen

SRC_DIR_=`pwd`
SRC_DIR_= python3 main.py ${SRC_DIR_} ${BUILDDIR}

echo ${SRC_DIR_}

Code: Alles auswählen

def main():
	
	if len(sys.argv) <= 2:
		print("Error: Wrong number of parameters!!")
		print("python3 main.py <sourceDirectory> <objectDirectory>")
		return 0

	print(sys.argv[1])
	print(sys.argv[2])
	return "OK"
BlackJack

@harald: Das ``return`` in der `main()`-Funktion hat keinen Effekt, das ist rein innerhalb vom Python-Prozess. Du kannst auf zwei Arten von Programmen aus etwas an die Shell zurück melden: Über den „return code”, das ist eine ganze Zahl die mit `sys.exit()` festgelegt werden kann und in der Shell in der Variablen $? landet, und in dem Du etwas im Programm ausgibst. Das kann man in der Shell dann mit den Backticks (`…`) wie Du das bei ``pwd`` gemacht hast oder IMHO besser mit der ``$(…)``-Syntax an einen Namen binden.

Was Du in der zweiten Zeile in dem Shell-Skript machst, ist wahrscheinlich so gar nicht das was Du denkst was das tut. Das bindet nämlich zuerst die Variable $SRC_DIR_ an eine leere Zeichenkette und führt *dann* das danach stehende aus. Nach dem ``=`` darf kein Leerzeichen stehen. Und wenn nur OK an den Namen gebunden werden soll, dann darf das Python-Programm auch nur OK ausgeben und nichts anderes.

Ob ein Programmablauf erfolgreich war, wird üblicherweise aber durch den „return code” angezeigt, wobei 0 per Konvention Erfolg und alle anderen Werte Misserfolg bedeuten.

Code: Alles auswählen

SRC_DIR=$(pwd)
OUTPUT=$(./main.py "$SRC_DIR" "$BUILD_DIR")
echo "$OUTPUT"
echo $?
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

Kleine zusätzliche Anmerkung: die Shell Variable $? enthält immer den Rückgabewert des *letzten* ausgeführten Programms, d.h. in BlackJacks Beispiel wird es den Returncode des davorstehenden echo Befehls aus Zeile 3 enthalten.
Man könnte den Wert direkt nach Zeile 2 in eine andere Variable zwischenspeichern:

Code: Alles auswählen

OUTPUT=$(./main.py "$SRC_DIR" "$BUILD_DIR")
RETURN_CODE=$?
»Honk Honk«
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Balmung hat geschrieben:Kleine zusätzliche Anmerkung: die Shell Variable $? enthält immer den Rückgabewert des *letzten* ausgeführten Programms
Ich hatte gerade überlegt, ob das so ist, denn ``echo`` ist in der Regel kein Programm sondern ein Shell-Builtin. Fazit: ja, das gilt auch für nicht-Programme :-)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Leonidas: Das fände ich auch ziemlich unhandlich, wenn man ständig überlegen müsste, ob man es gerade mit einem Builtin der Shell oder mit einem "echten" Programm zu tun hat.
BlackJack

Zumal das ja auch von Shell zu Shell verschieden ist.
Antworten