Rückgabewert an die aufrufende shell

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
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Mittwoch 24. Januar 2007, 22:23

Ich suche nach einer möglichkeit Rückgabewerte an die shell zu liefern ist

Code: Alles auswählen

sys.exit("rückgabewert")


die einzige möglichkeit? Und so Richtig?
Denn es scheint so nicht zu Funktionieren.

mfg
Smokie
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Mittwoch 24. Januar 2007, 22:29

Ich weiß nicht, was bei Dir nicht funktioniert. Hast Du versucht, eine Zahl zwischen 0 und 127 zurückzugeben oder etwas anderes?
http://www.python.org/doc/2.3.5/lib/module-sys.html schreibt:

> Most systems require it to be in the range 0-127, and produce undefined results otherwise
>...
> If another type of object is passed, None is equivalent to passing zero,
> and any other object is printed to sys.stderr and results in an exit code of 1.

Wenn Du also fälschlich immer den Exit Code 1 erhälst, könnte das daran liegen.

Gruß,
Bernhard
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Mittwoch 24. Januar 2007, 22:47

Super Danke funktioniert jetzt ;) *freu*
Allerdings hätte ich noch die frage ob es möglich ist
irgendwo im skritp Rückgabewerte zu liefern (ohne zu Beenden)?
Und evtl. nicht nur Ganzzahlen zwischen 0 und 127.

mfg
Smokie
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Donnerstag 25. Januar 2007, 12:39

Schlicht und ergreifend.

Code: Alles auswählen

sys.exit(aNumber)
ist das Ende.
Sollte es für Dich nötig sein, einen Prozess zu überwachen,
solltest Du Dich mit IPC (Pipes,Sockets,FIFO's) etc. auseinandersetzen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 25. Januar 2007, 14:18

Smokie_joe hat geschrieben:Allerdings hätte ich noch die frage ob es möglich ist
irgendwo im skritp Rückgabewerte zu liefern (ohne zu Beenden)?
Wie soll das gehen? Ein Rückgabewert wird zurückgegeben wenn das Programm sich beendet, so ist dieser Wert definiert. Die Einzige ausnahme, sind Deamons, die beim Starten sich Forken und ein Fork sind beendet und der andere weiterläuft, der Beendende Fork gibt dabei den Rückgabewert aus.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Smokie_joe
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 22:20

Donnerstag 25. Januar 2007, 23:02

okay ;)
Vielen dank für eure Antworten

mfg
Smokie
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 26. Januar 2007, 08:25

Smokie_joe hat geschrieben:irgendwo im skritp Rückgabewerte zu liefern (ohne zu Beenden)?
Warum gibst du die Daten nicht einfach mit print bzw. sys.stdout aus?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Freitag 26. Januar 2007, 08:37

jens hat geschrieben: Warum gibst du die Daten nicht einfach mit print bzw. sys.stdout aus?
Stimmt, mit ``subprocess`` und ein par "hacks" kann man dann den Output "Synchron" (Also ohne erst darauf zu warten dass das Programm beendet ist. Sondern während der Laufzeit den bisherigen puffer zu ``flush``en) auffangen. Aber wie realisiert man das wirklich? Versuche dahingehend habe bei mir nicht funktioniert (€: Der puffer wird immer erst ausgegeben wenn das Programm terminiert wurde.). Es soll aber irgendwie gehen.

lg
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 26. Januar 2007, 08:39

Sowas hat Gerold hier mal gezeigt...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Freitag 26. Januar 2007, 21:24

jens hat geschrieben:Sowas hat Gerold hier mal gezeigt...
Hast du den Link oder ein passendes Suchwort?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 26. Januar 2007, 22:00

sape hat geschrieben:
jens hat geschrieben:Sowas hat Gerold hier mal gezeigt...
Hast du den Link oder ein passendes Suchwort?
Hi!

http://www.python-forum.de/topic-4941.html

Funktioniert so aber nur zwischen Python-Programmen. Wenn andere Programmiersprachen mitspielen, sollte man ein anderes Datenaustauschformat verwenden.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 26. Januar 2007, 23:08

gerold hat geschrieben:Wenn andere Programmiersprachen mitspielen, sollte man ein anderes Datenaustauschformat verwenden.
Z.B. INI:

server.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os
import sys
from ConfigParser import ConfigParser
from StringIO import StringIO


def main():
    while True:
        stdin_string = sys.stdin.read()
        if not stdin_string:
            break
        
        inistream = StringIO(stdin_string)
        
        ini = ConfigParser()
        ini.readfp(inistream, "inistream")
        
        print
        print "Ausgabe des Servers:"
        print "********************"
        for key, value in ini.items("values"):
            print key, value
        print "********************"


if __name__ == "__main__":
    main()
client.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os
import sys
import time
import subprocess
from ConfigParser import ConfigParser
from StringIO import StringIO

EOF = "\x1a" # End of File


def generate_ini_string(valuedict):
    """INI-String erstellen"""
    
    ini = ConfigParser()
    ini.add_section("values")
    
    for key, value in valuedict.items():
        ini.set("values", str(key), value)
    
    stream = StringIO()
    ini.write(stream)
    
    return stream.getvalue()


# Serverprozess starten
proc = subprocess.Popen(
    (sys.executable, "server.py"),
    stdin = subprocess.PIPE,
    cwd = os.curdir
)

for i in range(2):
    # INI-String zum Server schicken
    valuedict = {"value1": i + 1, "value2": i + 2}
    proc.stdin.write(generate_ini_string(valuedict) + "\x1a")

    # warten
    time.sleep(3)

# Prozess schließen
proc.stdin.close()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Samstag 27. Januar 2007, 17:44

Hi, Gerold. Danke für die Beispiele, aber das funktioniert nicht so wie ich mir das denke. Das es hier nun OT ist habe ich einen neune Thread aufgemacht.

Hier gehts weiter: http://www.python-forum.de/viewtopic.php?p=56774#56774

lg
Antworten