2009-06-22 6 views
4

Erstens, was ist der beste/einfachste Weg zu erkennen, ob X11 läuft und für ein Python-Skript verfügbar ist.Erkennen, ob X11 verfügbar ist (Python)

Elternprozess?
Sitzungsleiter?
X Umgebungsvariablen?
andere?

Zweitens möchte ich ein Dienstprogramm (Python-Skript) haben, um eine GUI zu präsentieren, falls verfügbar, ansonsten ein Kommandozeilen-Tool.

Aus der Spitze von meinem Kopf ich dieses

-main Python-Skript

gedacht (erkennt, ob gui verfügbar ist und startet entsprechende Skript)
-gui oder Python-Befehlszeile Skript startet
-Beide eine allgemeine Verwendung Modul zur eigentlichen Arbeit

Ich bin sehr offen für Vorschläge, um dies zu vereinfachen.

+1

Mit "X" do you "The X Windowing System" bedeuten? Oder meinst du "X" wie in "Irgendein zufälliges Stück Software"? –

+0

Der GUI-Teil der Frage tendiert dazu, "X" zu disambiguieren, aber ich würde zustimmen, dass X11 eine klarere Frage stellen könnte. – Erik

+0

@Erik: Für mich bedeutet GUI "Konsole App für zufällige Stück X-Software". Um doppelte Fragen zu vermeiden, hilft es, jede Frage einigermaßen klar zu stellen. –

Antwort

4

Sie könnten die gui Teil einfach starten, und die Ausnahme fangen sie aufwirft, wenn X (oder jede andere Plattform systemabhängige Grafiken nicht verfügbar.

Stellen Sie sicher, dass wirklich ein interaktives Terminal haben, bevor Sie den textbasierten Teil läuft . Ihr Prozess ohne sichtbaren Terminal haben könnte begonnen, wie in der grafischen Benutzerumgebungen wie KDE, GNOME oder Fenster gemeinsam ist

+0

In der Tat wäre dies meine bevorzugte Vorgehensweise. Es ist auch üblich: Zuletzt habe ich überprüft, Redhat Anaconda Installer tut dies auch. – ephemient

+0

Das war das einfachste. Ich denke, die DISPLAY-Antwort ist gut, aber die Python-Ausnahmen sind bereits passiert. abhängig davon, wo Sie importieren möchten. dh Import gtk verursacht eine Ausnahme, wenn Ihr DISPLAY nicht gesetzt wurde (mit meiner Erfahrung). Ich nehme an, wenn Sie genug trugen, konnten Sie DISPLAY überprüfen und dann Importe für GUI-Bibliotheken tun. Ein weiteres Plus für DISPLAY ist meiner Meinung nach auf reinsten Programmierpraktiken basiert, bei denen Ausnahmen nicht mit der Programmlogik umgehen sollten (wenn Sie DISPLAY als Programmlogik klassifizieren möchten) –

9

Ich würde überprüfen, ob DISPLAY festgelegt ist (das ist, was C API X11-Anwendungen schließlich tun).

7

den Return-Code von xset -q überprüfen.

def X_is_running(): 
    from subprocess import Popen, PIPE 
    p = Popen(["xset", "-q"], stdout=PIPE, stderr=PIPE) 
    p.communicate() 
    return p.returncode == 0 

Was den zweiten Teil Ihrer Frage, schlage ich folgende main.py Struktur:

import common_lib 

def gui_main(): 
    ... 

def cli_main(): 
    ... 

def X_is_running(): 
    ... 

if __name__ == '__main__': 
    if X_is_running(): 
     gui_main() 
    else: 
     cli_main() 
Verwandte Themen