Du könntest auch einfach bei dem Funktionsparameter popen_args ein Sternchen davor machen: def popen_callback(on_exit, *popen_args): ----------------------------^ Python interpretiert das dann als wirf den ganzen Rest bitte in diese Liste. Noch besser wäre es wenn du dahinter dann noch **popen_kwargs setzt und an Popen übergibst: def popen_callback(on_exit, *popen_args, **popen_kwargs): def threaded_run(on_exit, popen_args, popen_kwargs): print popen_args proc = subprocess.Popen(*popen_args, **popen_kwargs) proc.wait() on_exit() return thread = threading.Thread(target=threaded_run, args=(on_exit, popen_args, popen_kwargs)) thread.start() return thread Damit kannst du dann auch noch keyword arguments (daher der name kwargs) übergeben wie zum Beispiel: popen_callback(callback, ["sleep", "10"], shell=True) -----Original Message----- From: Florian Lindner <mailinglists@xgm.de> Reply-to: Die Deutsche Python Mailingliste <python-de@python.org> To: python-de@python.org Subject: Re: [Python-de] subprocess mit callback Date: Mon, 20 Jun 2011 22:20:29 +0200 Am Montag 20 Juni 2011, 22:18:23 schrieb Florian Lindner:
Am Montag 20 Juni 2011, 21:17:22 schrieb Alexander Schlarb:
Er sagt bufsize must be integer dh: Du musst einen Integer anstelle eines Strings übergeben (=keine Anführungszeichen!)
common.popen_callback(cb, ["sleep", 10])
Sorry, habe mich da ungenau ausgedrückt. Das auszuführende Kommando soll "sleep 10" (idR /usr/bin/sleep) sein. Popen erwartet in args ja eine Liste mit dem Executable und den Parametern (ausg. shell=True). Mein Problem ist gerade, dass die "10" in buffsize landet und nicht Teil der Liste für args bleibt.
Ok, die Lösung kam mit dem drücken des Sende-Knopfes: popen_callback(cb, [["sleep", "10"]]) So, funktioniert es.
Grüße,
Florian
-----------------------------------^
-----Original Message----- From: Florian Lindner <mailinglists@xgm.de> Reply-to: Die Deutsche Python Mailingliste <python-de@python.org> To: python-de@python.org Subject: [Python-de] subprocess mit callback Date: Mon, 20 Jun 2011 20:46:14 +0200
Hallo,
ich würde gerne, ein subprocess Popen ein Prozeß aufrufen und mich benachrichtigen lassen, wenn dieser fertig ist. Da habe ich auch einen Tipp gefunden:
http://stackoverflow.com/questions/2581817/python-subprocess-callback-whe n- cmd- exits
mit modifizierten Namen schaut das so aus:
def popen_callback(on_exit, popen_args): def threaded_run(on_exit, popen_args): print popen_args proc = subprocess.Popen(*popen_args) proc.wait() on_exit() return
thread = threading.Thread(target=threaded_run, args=(on_exit,
popen_args)) thread.start()
return thread
Nur habe ich leider Probleme das aufzurufen:
In [29]: common.popen_callback(cb, ["sleep", "10"]) ['sleep', '10'] Out[29]: <Thread(Thread-12, started 140538833995520)> Exception in thread Thread-12:
Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "common.py", line 21, in threaded_run
proc = subprocess.Popen(*popen_args)
File "/usr/lib/python2.7/subprocess.py", line 629, in __init__
raise TypeError("bufsize must be an integer")
TypeError: bufsize must be an integer
cb ist meine callback funktion.
Ich nehme mal an, er interpretiert die "10" als das zweite Argument für Popen. Eine Reihe von anderen Methoden führte leider auch nicht zum Erfolg. Auch auf die Gefahr hin, mich hier lächerlich zu machen: Wie rufe ich das auf?
;-)
Danke!
Florian _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de