[Python-de] subprocess mit callback

Peter Otten __peter__ at web.de
Mo Jul 4 13:57:09 CEST 2011


Florian Lindner wrote:

> Am Samstag 02 Juli 2011, 17:35:00 schrieb Stefan Schwarzer:
>> Hallo Florian,
>> 
>> On 2011-07-02 12:25, Florian Lindner wrote:
>> > Am Dienstag 28 Juni 2011, 21:10:46 schrieb Hans-Peter Jansen:
>> >> On Tuesday 28 June 2011, 16:25:04 Florian Lindner wrote:
>> > async = Async(threading.Thread)
>> > 
>> > In [7]: @async
>> > 
>> >    ...: def add(b):
>> >    ...:     return b+2
>> > 
>> >    ...:
>> > In [8]: add(4)
>> > Out[8]: <Thread(add-1, stopped 139819357185792)>
>> > 
>> > Das klappt soweit alles ganz gut. Wenn ich allerdings die callback
>> > funktionen benutzen will, bekomme ich es nicht hin:
>> > 
>> > In [9]: def os(result):
>> >    ...:     print "Success", result
>> 
>> ich würde eher davon abraten, eine Funktion so zu nennen wie
>> ein häufig benutztes Modul aus der Standard-Bibliothek. Das
>> kann leicht zu Verwirrung führen.
> 
> Klaro, das war so nur in die Shell gehackt.
>  
>> > TypeError: __call__() takes at least 2 arguments (2 given)
>> 
>> Die Methode akzeptiert mindestens zwei Parameter, die du
>> auch angegeben hast, aber du bekommst einen TypeError dazu?
>> Hast du die Fehlermeldung richtig übernommen?
> 
> Ein komplettes Skript schaut jetzt so aus:
> 
> from common import Async
> import threading
> 
> async = Async(threading.Thread)
> 
> def o_s(result):
>     print "Success: ", result
> 
> @async(on_success=o_s)
> def add(x):
>     return x+2
> 
> res = add(2)
> print res
> 
> und wenn es ausgeführt wird:
> 
> florian at horus ~/SA/src (git)-[master] % python2 test.py
> Traceback (most recent call last):
>   File "test.py", line 9, in <module>
>     @async(on_success=o_s)
> TypeError: __call__() takes at least 2 arguments (2 given)
 
> Version von python ist 2.7.2. 

Faszinierende Fehlermeldung; Python 2.6 ist dagegen richtig langweilig:

> $ python async.py
Traceback (most recent call last):
  File "async.py", line 68, in <module>
    @async(on_success=on_success)
TypeError: __call__() takes at least 2 non-keyword arguments (1 given)

> Wenn ich den Dekorator ohne Argumente
> benutze funktioniert es, aber halt kein Callback.

Probier es mal zu Fuß:

def add(x):
    return x + 2
add = async(add, on_success=o_s)




Mehr Informationen über die Mailingliste python-de