8
votes

Comment déterminer à partir d'une application Python si X Server / X Transfert est en cours d'exécution?

J'écris une application Linux qui utilise PYQT4 pour l'interface graphique et qui ne sera utilisée que lors des sessions distantes de
( ssh -xy / vnc ). < / p>

Donc, parfois, il peut arriver qu'un utilisateur oubliera d'exécuter ssh avec x paramètres de transfert ou x expéditeur sera indisponible pour une raison quelconque. Dans ce cas, l'application se bloque mal (malheureusement, je suis forcée d'utiliser une ancienne bibliothèque C ++ en enveloppée dans Python et désactive complètement la session en cours de l'utilisateur si l'application se bloque).

Je ne peux pas utiliser autre chose d'autre, alors mon idée est de vérifier si X Transfert est disponible avant de charger cette bibliothèque. Cependant, je n'ai aucune idée de comment faire ça.

J'utilise habituellement xclock pour vérifier si ma session dispose d'un transfert de transmission X, mais que l'utilisation de XClock sonne comme une solution de contournement.

ajouté
Si possible, j'aimerais utiliser une autre manière que de créer une fenêtre pyqt vide et d'attraper une exception.


0 commentaires

4 Réponses :


8
votes

Vérifiez que la variable $ afficheur est définie - S'ils n'utilisaient pas ssh -x , il sera vide (au lieu de contenir quelque chose comme < Code> localhost: 10 ).


2 commentaires

C'est exagéré ce que je cherchais, propre et simple, merci.


Que se passe-t-il s'ils utilisent ssh -x mais n'ont pas de serveur X en cours d'exécution? De mes tests occasionnels, il semble que $ Afficher ne soit pas défini, mais est-ce de manière fiable?



8
votes

Comme mentionné précédemment, vous pouvez vérifier la variable d'environnement d'affichage:

import os
import socket

def tcp_connect_to_display():
        # get the display from the environment
        display_env = os.environ['DISPLAY']

        # parse the display string
        display_host, display_num = display_env.split(':')
        display_num_major, display_num_minor = display_num.split('.')

        # calculate the port number
        display_port = 6000 + int(display_num_major)

        # attempt a TCP connection
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
                sock.connect((display_host, display_port))
        except socket.error:
                return False
        finally:
            sock.close()
        return True


1 commentaires

Je me souviendrai de cette solution, peut-être qu'elle sera utile à l'avenir merci.



2
votes

Semblable à votre solution XClock, j'aime exécuter xdpyinfo et voir s'il renvoie une erreur.


1 commentaires

C'est génial car il sort avec zéro si le client n'a pas eu d'exécution X-Server (une chose commune pour les utilisateurs de Windows qui oublient de démarrer Xming). Je vais l'utiliser dans un script Bash, merci.



0
votes

X-Server peut être vérifié avec tkinter comme dans l'exemple suivant (mais il devrait y avoir une manière similaire avec pyqt4 ): xxx

Ceci vérifiera $ Afficher paramètre, processus X-Server et associé xhost autorisation (mais utilise tkinter au lieu de pyqt4 < / em>).


0 commentaires