webbrowser öffnen

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
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Hallo,

Das Öffnen des Webbrowsers funktioniert bei mir manchmal nicht. Ich habe mit dem debugger direkt vor dem Aufruf von webbrowser.open() einen Haltepunkt gesetzt. Wenn ich im debugger webbrowser.open() aufrufe bleibt der Aufruf hängen. Wenn ich einen KeyboardInterrupt sende, kommt manchmal diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python2.7/webbrowser.py", line 66, in open_new
    return open(url, 1)
  File "/usr/lib/python2.7/webbrowser.py", line 61, in open
    if browser.open(url, new, autoraise):
  File "/usr/lib/python2.7/webbrowser.py", line 198, in open
    p = subprocess.Popen(cmdline, close_fds=True, preexec_fn=setsid)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1234, in _execute_child
    data = _eintr_retry_call(os.read, errpipe_read, 1048576)
  File "/usr/lib/python2.7/subprocess.py", line 478, in _eintr_retry_call
    return func(*args)
Woran kann das liegen?

Danke,
Boa
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das ist aber doch nicht der komplette Traceback, oder? Ich vermisse darin nämlich den Teil, wo *dein Code* die Aufrufkette anstößt. Außerdem ist es immer sehr hilfreich, neben dem Traceback auch ein Minimalbeispiel mitzuliefern, welches dem tatsächlichen Code bestmöglich entspricht und bei dem der Fehler auch tatsächlich auftritt.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Das ist nur der interessante Teil des Tracebacks. Ein Minimalbeispiel habe ich leider nicht. Prinzipiell funktioniert der Aufruf von webbrowser.open; selbst in dem Code Segment, dass ich zeigen könnte. Ich weiß ja, dass es genau an dem Aufruf webbrowser.open bzw an einer der Varianten liegt und nicht direkt an meinem Code, weil ich den debugger davor eingeschaltet habe und den Fehler dort reproduzieren kann, wenn er erst Mal aufgetreten ist. Ich bin gerade dabei die neuesten Updates einzuspielen und die VM ausnahmsweise Mal neuzustarten. Vielleicht liegt es am OS.
[EDIT] Nein, Neustart und Updates haben nicht geholfen.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Der eigentliche Fehler ist nicht der, der beim Traceback gezeigt wird, sonder dass der Aufruf blockiert.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Eine debug session sieht folgendermaßen aus:

Code: Alles auswählen

> /home/joe/projects/eclipse_ws/nubisave_clone/nubisave/CloudFusion/cloudfusion/store/dropbox/dropbox_store.py(110)__init__()
    109             ipdb.set_trace()
--> 110             webbrowser.open_new(url)
    111             print "1"

ipdb> webbrowser.open("http://www.google.de")
^C*** KeyboardInterrupt: 
ipdb> print "hi"
hi
ipdb> 
Der Code steht auf https://github.com/joe42/CloudFusion/tree/development zur Verfügung.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Es hat etwas damit zu tun, dass subprocess nicht zurückkehrt. Ich habe im Debugger an der Stelle

Code: Alles auswählen

subprocess.call(["ls", "-l"])
ausgeführt. Dabei bekomme ich die Ausgabe des Befehls, jedoch bleibt dieser dann auch hängen.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Ok, Problem gelöst. Da haben sich zwei Threads blockiert. Die Lösung war statt des Threads einen eigenen Subprozess zu öffnen. Python Thread Scheduling :roll:
BlackJack

@Boa: Das dürfte mit Python nicht viel zu tun haben. Das verwendet „native” Threads des Systems.
Antworten