threads und stdin/out/err

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
.D0T
User
Beiträge: 21
Registriert: Donnerstag 17. August 2006, 17:45

Hallo Leute. Ich schribsel atm. j4f an einem kleinen jabber bot für mich und bin dabei auf ein mMn. dummes Problem gestoßen:

Ich will in den bot eine python code.InteractiveConsole integrieren, soweit so gut. Python macht einem das ja eigentlich auch wirklich einfach, sys.stdin/out umleiten und schwupps kann ich das ganze auf den "Chat" legen. Da der bot jedoch während der ganze Aktion auf andere Sachen reagieren muss bin ich gezwungen den Interpreter als eigenen Thread laufen lassen.

Schon hab ich den Salat, sys.stdout/in/err sind global auch über Thread hinweg, d.h. ändere ich sie um sie für den Interpreter umzubiegen ändert es sich auch für meinen "Hauptthread". Das ist ziemlich unangenehm weil ich den bot so geschrieben habe das ich ihn mit python -i aufrufe, d.h. meine schöne shell leite ich plötzlich auch um ohne das zu wollen.

Selbst wenn ich auf -i verzichten würde wärs immer noch dämlich wenn 2 externe Benutzer gleichzeitig den python Interpreter benutzen wollen, da brauchte ich ja dann 2 Threads und der ersetzte stdout/in/err kann ja nicht riechen was das richtige Ziel ist....ziemlich dumm also :roll:

Zwar kann ich in code.InteractiveConsole die raw_input und write Funktion überschreiben aber die gelten nicht für die mit dieser shell ausgeführten Befehle. Schickt einer einen print Befehl an meinen bot läuft der über stdout und nicht über die überschriebene Funktion.

Da ich von python bis auf ein paar Tutorials etc. eher wenig Ahnung hab hoffe ich das ich was übersehen hab und die Lösung einfach ist ;-)

Ich hoffe ihr könnt mir helfen!

MfG
.D0T
ps: Fast vergessen, CPython 2.5 unter win32
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sowas ähnliches machten wir für das Debugging System in Werkzeug.

Hier eine Klasse die sys.stdout Wrappt, dass jeder Thread "seinen eigenen" stream bekommt: http://trac.pocoo.org/browser/werkzeug/ ... til.py#L24

Udn hier wird er installiert: http://trac.pocoo.org/browser/werkzeug/ ... t__.py#L61
TUFKAB – the user formerly known as blackbird
.D0T
User
Beiträge: 21
Registriert: Donnerstag 17. August 2006, 17:45

Vielen Dank blackbird, ich guck mir das mal an. Ich hab mich schier zu tode gesucht ;-) So ein Forum is ne Klasse sache!

MfG
.D0T
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

OT: blackbird, der Name gefällt mir irgendwie nicht. Erinnert mich zu sehr an Werkkzeug.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Y0Gi hat geschrieben:OT: blackbird, der Name gefällt mir irgendwie nicht. Erinnert mich zu sehr an Werkkzeug.
Joa. Nach der Benennung ist mir das auch eingefallen. Aber da die Projekte bis auf den Namen nix gemeinsam haben isses jetzt glaub ich kein Verbrechen :)
TUFKAB – the user formerly known as blackbird
Antworten