webbrowser.open verursacht seltsames Verhalten

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
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Hallo Community,
nachdem ich mich mit ein paar How2 und Tuts befasst habe, hat es mich Python erwischt. :D
Nur leider habe ich schon am Anfang ein paar Fragen zu einem einfachen Script.
Die Idee sieht so aus; ich möchte in gewissen Zeitabständen eine URL anzeigen -> so als eine Art Statusdisplay.
Der erste Versuch mittels default Browser (NetSurf)

Code: Alles auswählen

#!/usr/bin/python
import time
import webbrowser

web1=webbrowser.get()
web1.open('index1.html')
time.sleep(60)
web1.open('index2.html',0,True)
Ok vom Prinzip her funktioniert es, nur dass index2.html nicht im selben Tab geladen wird, sondern eine eigene Instanz des Browsers startet und die Seite darin anzeigt.
Leider wird mein Raspberry PI nicht soviel RAM haben um das einen ganzen Tag durchzuhalten.

Gut, dann nochmal mit einem geläufigeren Browser (Chromium)

Code: Alles auswählen

#!/usr/bin/python
import time
import webbrowser

web1=webbrowser.get('/usr/bin/chromium %s')
web1.open('index1.html')
time.sleep(60)
web1.open('index2.html',0,True)
Da ist das Verhalten nun sehr komisch: es wird chromium gestartet mit index1.html,
aber dann passiert nichts. Das Script arbeitet nicht weiter solange der Browser läuft.
Schließe ich nun den Browser, so kommt das Script zum sleep und öffnet mir erst danach index2.html
Ähm warum? Das verstehe ich nicht so ganz... :K

Ziel ist es letztendlich verschiedene Seiten in ein und dem selben Tab anzeigen zu lassen und jede Seite
bekommt einen Zeitrahmen (so ca. 1min)

Wo liegt nun mein Fehler und wie funktioniert es richtig?

Beste Grüße
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich glaube du solltest besser auf ein eigenes Userscript (d.h. Javascript welches im Browser ausgeführt wird) setzen für das erwünschte Verhalten statt webbrowser.open, da ich befürchte, dass man die gängigen Browser von außen nicht dazu bekommt eine Adresse im existierenden Tab zu öffnen (außer evtl. per xdotool).
Zuletzt geändert von webspider am Donnerstag 15. November 2012, 19:13, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie kommst du darauf dass ``webbrowser.get("irgendwas")`` etwas sinnvolles macht? So wie ich das sehe gibt es einige registrierte Browser (da ist Chromium nicht dabei) und man kann welche selbst definieren. Schau dir doch mal die Dokumentation des Webbrowser-Moduls an.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Naja das muss doch irgendiwe funktionieren :D wenn selbst in der Doku steht (new=0 open in same browser window if possible)
Aus eben genau dieser Doku entstand die Idee... JavaScript will bzw. muss ich nicht unbedingt haben - da möchte ich lieber auf Python setzen; außer es geht technisch einfach nicht.

Was ist dann eigentlich der Unterschied zu einem registrierten Browser und zu webbrowser.get('<Browserpfad> %s')?
Im Netz habe ich auch schon öfters das get mit Browserpfad gesehen? Oder ist das nur die quick&dirty Methode?

Beste Grüße

EDIT:
Ich hab jetzt etwas herumprobiert und dabei ist folgendes herausgekommen...
http://nullege.com/codes/search/webbrowser.register

Code: Alles auswählen

#!/usr/bin/python
import webbrowser
import time

webbrowser.register('iceweasel',None,webbrowser.BackgroundBrowser('iceweasel'))
webbrowser.get('iceweasel').open('index1.html')
time.sleep(20)
webbrowser.get('iceweasel').open('index2.html',0,True)
Blöd ist halt nur, dass er mir ein neues Tab öffnet anstatt es im selben zu laden. Mir ist es eigentlich egal welcher Browser mir es anzeigt - Hauptsache er lädt es im selben Tab
BlackJack

@Leonidas: Die Dokumentation zum `webbrowser`-Modul deckt anscheinend nicht alles ab was `get()` intern tatsächlich macht. Wenn man sich die Implementierung anschaut, sieht man zum Beispiel, dass man ein '&' anhängen sollte, wenn man den '%s'-Platzhalter angibt und gerne einen asynchron gestarteten Browser haben möchte:

Code: Alles auswählen

def get(using=None):
    """Return a browser launcher instance appropriate for the environment."""
    if using is not None:
        alternatives = [using]
    else:
        alternatives = _tryorder
    for browser in alternatives:
        if '%s' in browser:
            # User gave us a command line, split it into name and args
            browser = shlex.split(browser)
            if browser[-1] == '&':
                return BackgroundBrowser(browser[:-1])
            else:
                return GenericBrowser(browser)
        else:
            # ...
@anakin87: In der Dokumentation steht wie Du schon richtig sagst „new=0 open in same browser window if possible”, wobei die letzten beiden Worte entscheidend sind. Wenn das nicht möglich ist, na dann ist das halt nicht möglich.

Und spätestens wenn Du keinen von den Browsern verwendest, die das Modul kennt, sondern eine Kommandozeile mit Platzhalter angibst, dann bist *Du* dafür verantwortlich dem Browser dort auch mitzuteilen wie und wo er die URL öffnen soll. Sofern das möglich ist natürlich auch nur wieder.

Die simpelste, wenn auch nicht gerade schönste Lösung wenn es regelmässige Abstände sind, wäre wohl ein Refresh-Meta-Tag in der HTML-Seite, das dafür sorgt, dass sie regelmässig neu geladen wird.
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Also eigentlich wird iceweasel von webbrowser._browsers aufgelistet und sollte funktionieren. Auf der Doku-Seite steht auch was von Konqueror den ich dann gleich mal ausprobieren muss.

EDIT: auch Konqueror der in der Doku auch angeführt wird öffnet mir es nicht im gleichen Tab.
Kann das irgendwer bestätigen, oder funktioniert es überhaupt das Aufrufen im gleichen Tab bei jemanden?
langsam bekomme ich Zweifel
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich glaube nicht, dass überhaupt mit irgend einem Browser geht, wenn ich ehrlich bin.
Python kann da ja auch keine Magie machen, sondern dem Browsern beim Aufruf nur die Argumente auf der Kommandozeile mitgeben, die der Browser auch versteht.
Die Übersicht über diese Argumente für den Firefox findest du zum Beispiel hier.
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Ja das ist mir schon klar, aber die Doku suggestierte, dass es unter irgendwelchen Umständen möglich ist/war.
Falls es wirklich nicht möglich ist bleibt mir nichts anderes als JavaScript/AJAX mit iframes... :(
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Die Dokumentation ist an der Stelle vielleicht unvollständig (wie BlackJack festgestellt hat), aber sie suggeriert keineswegs etwas Falsches.
Hier ist nämlich von "Window" die Rede, nicht von "Tab". Und wenn du dir die Kommadozeilenargumente für den Firefox anschaust, wirst du sehen, dass es durchaus eine Option gibt etwas in einem neuen Fenster zu öffnen.

Ohne die Hintergründe zu kennen: der einfachste Weg wäre wohl (wenn du die Webinhalte nicht verändern kannst, und keine Lust hast etwas in JavaScript zu bauen) einfach eines der zahlreichen "reload"-AddOns für den Firefox zu installieren und damit die Webseite in regelmäßigen Abständen neu laden zu lassen.
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Gut möglich, aber dann verstehe ich den Unterschied zwischen new=0 und new=2 nicht bei webbrowser.open...
Aber ich fürchte auch langsam, dass für mein Szenario das so nicht die Lösung ist - schade.
Jedoch soll mir das nicht den Spaß an Python vermiesen :wink:

@all danke für die Hilfe
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Du könntest einen Blich in den entsprechenden Source-Code der Bibliothek werfen.
An dieser Stelle trifft irgendwann der Aufruf für den Firefox auf.

Code: Alles auswählen

remote_action = ""
remote_action_newwin = ",new-window"
remote_action_newtab = ",new-tab"
remote_action wird verwendet wenn 0 übergeben wird, remote_action_newwin bei einer 1, remote_action_newtab bei einer 2. Es ist also relativ transparent was dort passiert und welche Argumente verwendet werden.

Wenn du selbst übrigens einen Browser vorgibst, der nicht nicht enthalten ist, wird der new-Parameter einfach ignoriert.

Gruß
Sparrow
anakin87
User
Beiträge: 6
Registriert: Donnerstag 15. November 2012, 16:50

Ok nun wird mir einiges klar - wenn nichts definiert ist kann er auch nichts tun ;)
Dann werd ich für dieses Problem eine andere Lösung suchen.

THX für die Erklärung
Antworten