• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[geloest?]:Variablenrueckgabe aus einer Python routine

ws1964

Hacker
Hallo Leute,

Ich moechte gern ein Python Programm schreiben, dem ich Parameter uebergebe, sagen wir mal einen Parameter, der wird in dem Python Programm bearbeitet und nun brauche ich diesen Parameter oder besser diesen Inhalt zurueck.
Die Uebergabe aus dem Shellscript ist kein Problem
Code:
#!/bin/bash
python vartest.py  $Uebergabevariable
in Python selber:
Code:
#!/usr/bin/python

import sys
   sText=sys.argv[1] # Uebernahme der Variable in Python
.
.
.
# ??? Rueckgabe an die Shell ???
Und nun wuerde ich gern an das obige Shellscript die Variable oder besser das Ergebnis zurueckgeben, so dass es dem Script als Inhalt einer Variablen wieder vorliegt.

Hat da schon jemand Erfahrungen gesammelt?

Ich Danke allen im Voraus.

Wolf
 

Wizzzard

Member
Das geht nicht! Das aufgerufene Skript kann keine Umgebungsvariablen an Vaterprozesse weiterreichen.

Lösung ist, das Skript schreibt das Ergebnis nach stdout. In der Shell schreibt man dann:
Code:
#!/bin/sh
UEBERGABEVARIABLE="Test"
ERGEBNIS="$(python_skript.py ${UEBERGABEVARIABLE})"
echo $ERGEBNIS
 

Wizzzard

Member
Wenn man nur ganzzahlige positive Werte übertragen möchte, geht das natürlich auch über sys.exit(zahl). Da darf sich der OP mal was aussuchen. (Achtung 'zahl' darf nicht beliebig groß werden. Der Wertebereich ist zumindest in der Bash selbst stark eingeschränkt.)
 

regexer

Advanced Hacker
Wizzzard schrieb:
Der Wertebereich ist zumindest in der Bash selbst stark eingeschränkt.
Das stimmt! Es geht nur von 0 - 255, dannach fängt die Bash wieder von vorne zu zählen an.
Code:
prompt> bash -c 'exit 300'
prompt> echo $?
44
Doch im Prinzip ist dieser Weg für eine "Variablenrückgabe" unbrauchbar. Wie will ich zwischen echten Fehlern der Subshell und Variablenrückgaben unterscheiden?
Code:
prompt> bash -c 'gibtesnicht'
bash: gibtesnicht: command not found
prompt> echo $?
127
prompt> bash -c 'ls gibtesnicht'
ls: gibtesnicht: No such file or directory
prompt> echo $?
2
 

TomcatMJ

Guru
Hi!
Mal als Nicht-Programmierer eingeworfen: Wie wärs mit dem alten dirty Trick in Form des Aufrufs von
Code:
export VARIABLE=wert
wie mans in der Bash selbst machen würde als externen Befehlsaufruf in Python? Den Aufruf externer Befehle aufd dem System müsste normalerweise doch auch Python drin haben,oder? Export wäre ja auch nur ein externer Befehl den man somit aufrufen könnte um dadrüber etwas weiterzureichen....

Bis denne,
Tom
 

regexer

Advanced Hacker
TomcatMJ schrieb:
Export wäre ja auch nur ein externer Befehl den man somit aufrufen könnte um dadrüber etwas weiterzureichen....
Nützt nichts, da der python-Prozess ein Child-Prozess ist. Und als solcher darf keinen Einfluss auf die Umgebung des Parent haben. Die Vererbung mit export funktioniert nur von Parent zu Child und nicht umgekehrt (wie im echten Leben).
Das hat eigentlich wenig mit Python zu tun, sondern eher mit der Shell-Logik.
Code:
prompt> bash       # mache Kindprozess auf
prompt> export testvar="xxx"
prompt> echo $testvar
xxx
prompt> bash       # mache Enkel-Prozess auf
prompt> echo $testvar
xxx
prompt> exit       # beende Enkel-Prozess
prompt> exit       # beende Kind-Prozess
prompt> echo $testvar

prompt>
 
OP
ws1964

ws1964

Hacker
Hallo Leute,

Hat ja nun endlos gedauert, aber nun mach ich mal Nägel mit Köpfen.

Die Lösung und danke an Alle, die mir mit Shell-Hilfen zur Seit standen.

1. das Python Programm (name: "return.py"):
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
a = []
a.append("Zeichenkette")
a.append(7)
sys.exit(a)
2. das Shell Script:
Code:
echo $(./return.py)

Das übergeben von Parametern an Python erwähne ich mal nicht mehr, klappt sowieso :)

Danke und gelöst.

Wolf
 

Wizzzard

Member
Da hättest du auch gleich in python ein print mit dem Rückgabewert machen können.

Das $(...) fängt nämlich quasi die Standardausgabe der darin ausgeführten Befehle auf. Ist quasi das gleiche wie Backticks in der Bash.
 
OP
ws1964

ws1964

Hacker
Wizzzard schrieb:
Da hättest du auch gleich in python ein print mit dem Rückgabewert machen können.

Das $(...) fängt nämlich quasi die Standardausgabe der darin ausgeführten Befehle auf. Ist quasi das gleiche wie Backticks in der Bash.
Du hast vollkommen recht.
Habe mittlerweile einen Umweg "programmiert".
Hier python: "rueckgabe.py"
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys

a = []

a.append("Zeichenkette")
a.append(7)
a.append("ENDE")

sys.exit(a)

Dann das Shellscript:
Code:
#!/bin/bash

t=0
./rueckgabe.py 2> parameter
`sed -e 's/[,\[]*//g' -e 's/\]//g' parameter > test`
Parameter=(`grep "" test`)

while [ -n "${Parameter[$t]}" ] 
	do
			echo ${Parameter[$t]}
			((t++))
	done
rm test
rm parameter
Alles nicht so befriedigend, aber was solls.

Wolf
 
Oben