2009-06-22 6 views
4

Premièrement, quelle est la meilleure/la plus simple façon de détecter si X11 est en cours d'exécution et disponible pour un script python.Détecter si X11 est disponible (python)

processus parent?
responsable de session?
X variables d'environnement?
autre?

Deuxièmement, je voudrais avoir un utilitaire (script python) pour présenter un gui si disponible, sinon utiliser un outil sauvegardé en ligne de commande.

Du haut de ma tête, je pensais à ce

script python -main (Détecte IUG est disponible et lance script approprié)
-gui ou script python ligne de commande commence
-Les deux utilisent un générique module pour faire le travail réel

Je suis très ouvert aux suggestions pour simplifier cela.

+1

par « X » voulez-vous dire « X fenêtrage système »? Ou voulez-vous dire "X" comme dans "Une partie aléatoire du logiciel"? –

+0

La partie GUI de la question a tendance à désambiguïser 'X', mais je suis d'accord en précisant que X11 pourrait poser une question plus claire. – Erik

+0

@Erik: Pour moi GUI signifiait "console d'application pour un morceau aléatoire de logiciel X". Pour éviter les questions en double, il est utile de clarifier chaque question. –

Répondre

4

Vous pouvez simplement lancer la partie IUG et attrapez l'exception soulève lorsque X (ou tout autre système graphique dépendant de la plate-forme est disponible.

Assurez-vous que vous avez vraiment une borne interactive avant de lancer la partie à base de texte . Votre processus aurait pu être démarré sans un terminal visible, comme cela est courant dans les environnements utilisateur graphiques comme KDE, GNOME ou windows

+0

En effet, ce serait aussi mon approche préférée. C'est aussi commun: après avoir vérifié, l'installateur de Redhat's Anaconda le fait aussi. – ephemient

+0

C'était le plus facile. Je pense que la réponse de DISPLAY est bonne, mais les exceptions python auront déjà eu lieu; en fonction de l'endroit où vous vouliez importer. ie importer gtk provoque une exception si votre DISPLAY n'a pas été défini (avec mon expérience). Je suppose que si vous avez assez porté, vous pouvez vérifier DISPLAY puis faire des importations pour les bibliothèques gui. Selon moi, un plus de plus pour DISPLAY est basé sur les pratiques de programmation les plus pures où les exceptions ne devraient pas gérer la logique du programme (si vous voulez le classer en tant que vérification de DISPLAY comme logique du programme) –

9

Je vérifie pour voir si DISPLAY est défini (c'est ce que les applications C API X11 font après tout).

7

Vérifiez le code de retour de xset -q.

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

Quant à la deuxième partie de votre question, je propose la structure main.py suivante:

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() 
Questions connexes