IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

.py en service ou daemon


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut .py en service ou daemon
    Bonjour,

    Encore moi et mes questions
    J'ai un script python que pour le moment j'exécute sous ubuntu pour vérifier si une ip répond et sinon j'ouvre une popup.

    Dans ce script je récupère le path du .py pour créer un fichier dans le répertoire où il est placé.
    J'aimerai transformer ce script en service et/ou daemon pour que le client n'aie plus qu'a le prendre et le copier dans le répertoire de son choix sans rien à faire.

    Est ce que sous windows, le client devra installer python?
    Comment inclure tous les import du .py pour que le client n'aie rien à faire qu'à copier ce script. (exemple Tkinter ou subprocess...)

    Voilà je n'ai jamais fait une telle manipulation donc j'aurai voulu avoir des pistes et savoir si quelqu'un l'a déjà fait.


    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Par défaut
    Bonjour,

    L'utilisateur final devra dans tous les cas, passer par une installation du programme. Le simple fait de copier-coller un script ne va pas le rendre exécutable entant que service ou deamon sous linux. Enfin je crois...


    Pour ce qui est des questions à propos de l'utilisation de Python sur Windows :
    Oui, l'utilisateur devra avoir installé Python sur son PC (et de préférence la même version que celle avec laquel le script aura été crée, ça va de soit).
    Tkinter et subprocess sont fournis avec tous les modules et packages standards de python sur Windows, mais certaines fonctions de subprocess fonctionnent différemment il me semble (lire la doc pour plus d'infos).

    Il existe une library pour distribuer ses scripts, mais je ne l'ai pas encore utilisé pour pouvoir en parler d'avantage.

    Bonne soirée.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Il existe un module, mais jamais testé

    http://pypi.python.org/pypi/python-daemon/

    Pour windows il y a cette recette.

    En fait tu peux taper sur google

    daemonize python fork, et tu auras une pléthore de résultats corrects

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Merci de vos réponses

    Mais en créant un service, le script se trouvera où?
    C'est la première fois que je crée un service donc je suis un peu perdu mais étant donné que dans mon script je récupère le path du script, est ce que ça ne posera pas de problèmes?


  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Quand tu télécharges un fichier.py, tu le mets dans le même dossier que tes autres fichiers, il suffit ensuite de l'importer comme tout autre module.

    Mais en créant un service, le script se trouvera où?
    Dans un fichier nommé service.py par exemple.

    Tu mets ensuite ton fichier dans le même dossier que ton script.

    Dans ton script tu appelles le module comme ceci

    est ce que ça ne posera pas de problèmes?
    La seule chose à faire gaffe c'est la compatibilité de ta version python et de celle du script.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    J'ai créé un exe avec py2exe c'est déjà un début

    Par contre quand j'exécute mon .py en console, ma fonction qui est appelé toutes les x secondes avec un thread fonctionne correctement et ne me recrée pas un processus à chaque appel.
    Tandis qu'avec l'exe créé quand je le lance, on dirait qu'à chaque appel il crée un nouveau processus et forcément au bout d'un temps la mémoire est saturée

    En plus il ne m'ouvre pas la popup qui elle s'ouvre quand j'exécute le .py
    Voilà ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    isDown = False
    isOpen = False
    def MyTimer(isOpen,tempo = float(time)):
     
        #si linux   
        if sys.platform == "linux2":
            lPing = subprocess.Popen(["ping","-c", "1 ", ip ],  
    					    stdout = subprocess.PIPE, 
    					    stderr = subprocess.PIPE) 
        elif sys.platform == "win32":
            lPing = subprocess.Popen(["ping","-n", "1 ", ip ],  
    					    stdout = subprocess.PIPE, 
    					    stderr = subprocess.PIPE) 
     
        sLigne, erreur = lPing.communicate()
        print sLigne
        transmis = 0
        received = 0
        loss = 100
        time = 0
        #si linux   
        if sys.platform == "linux2":
            info_reg = info_reg = re.search(r'(\d+) packets transmitted',sLigne,re.M)
            if info_reg:
                transmis = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'(\d+) received',sLigne,re.M)
            if info_reg:
                received = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'(\d+)% packet loss',sLigne,re.M)
            if info_reg:
                loss = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'time (\d+)ms',sLigne,re.M)
            if info_reg:
                time = int(info_reg.group(1))
            #info_reg = info_reg = re.search(r'(\d+) packets transmitted, (\d+) received, (.+)% packet loss, time (\d+)ms',sLigne,re.M)
        elif sys.platform == "win32":
            info_reg = info_reg = re.search(r'envoyés = (\d+)',sLigne,re.M)
            if info_reg:
                transmis = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'reçus = (\d+)',sLigne,re.M)
            if info_reg:
                received = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'perte (\d+)%',sLigne,re.M)
            if info_reg:
                loss = int(info_reg.group(1))
            info_reg = info_reg = re.search(r'Moyenne = (\d+)ms',sLigne,re.M)
            if info_reg:
                time = int(info_reg.group(1))
            #info_reg = info_reg = re.search(r'Paquets : envoyés = (\d+), reçus = (\d+), perdus = (\d+) perte (.+)%',sLigne,re.M)
     
        now = datetime.datetime.now()
        print sys.platform
        #si l'expression régulière a donné un résultat
        if transmis > 0:
            """transmis = int(info_reg.group(1))
            received = int(info_reg.group(2))
            loss = int(info_reg.group(3))
            time = int(info_reg.group(4))"""
            isDown = False
            if received == 0:
                isDown = True
    	    #si le serveur répond après avoir été down et qu'il y a un fichier à uploader alors upload
    	    #recupere les parametres du fichier 
            if isDown == 'False':
                #Ferme la fenêtre pour encoder les pointages locales
                if isOpen == True:
                    #close window
                    racine.destroy()
     
                fen_upload(racine)
                isOpen = False
                if(os.path.exists(pathLoc) and os.path.getsize(pathLoc) > 0):
                    transport = paramiko.Transport((ip, port)) 
                    transport.connect(username = user, password = passwd) 
                    sftp = paramiko.SFTPClient.from_transport(transport) 
                    sftp.put(pathLoc,pathServ) 
                    sftp.close() 
                    transport.close() 
                    #print 'Upload done.' 
                    os.remove(pathLoc)                  #supprime fichier
            else:
    	        if(received == 0 and isOpen == False):
    	            print now.strftime("%d/%m/%YT%H:%M:%S")
    	            fen_matricule(racine)
    	            isOpen = True
        else:
            received = 0
            if(received == 0 and isOpen == False):
                print now.strftime("%d/%m/%YT%H:%M:%S")
                #fen_matricule(racine)
                isOpen = True
     
        threading.Timer(tempo, MyTimer, [isOpen,tempo]).start()
     
        MyTimer(isOpen,float(time))
    Merci de votre aide

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Bonjour,

    C'est encore moi et mes soucis
    J4ai bien réussi à créer un démon pour linux mais je ne comprends pas la méthode pour faire l'équivalent pour windows.
    J'ai bien tenté de suivre des tutos mais sans succès.
    http://code.activestate.com/recipes/...ice-in-python/

    En fait je ne comprends pas si je dois refaire exactement cet exemple et alors où mettre le code de mon script python qui doit s'exécuter comme service.
    De plus comment faire pour qu'il démarre en même temps que la machine.

    Merci de votre aide

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Je reviens avec d'autres infos.

    J'ai installé pywin32 et je me suis basé sur le livre : python programmin on win32
    Ils expliquent d'exécuter depuis le répertoire où est pythonservice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PythonService.exe /register
    et là j'ai registration failed due to RegSetValue() of service EXE error 5
    //J'ai lu que c'était un problème de droits mais comment règler cà (je suis sous seven)
    Ensuite je dois faire
    et là il me met:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    usage: monService.py [options] install:update:remove:start [...]:stop:restart ^[...]:debug [...]'
    Options for 'install' and 'update' commands only:
    --username ....
    --password
    --startup
    --interactive
    Merci de votre aide pcq je sens que la fin approche

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Par défaut
    Merci de votre aide mais je suis toujours bloque pour creer le service windows.
    J ai regarde ce lien http://code.activestate.com/recipes/...ice-in-python/
    Mais je ne comprends pas ou je dois copier le code de mon script?
    Et apres avoir ce squelette.py, quelle commande est ce que je dois executer?
    Comment faire pour pouvoir reprendre ce service une fois cree et le mettre sur une autre machine sans avoir besoin d installer python dessus?

    Merci

Discussions similaires

  1. [MySQL] pb mysqli/script daemon service windows
    Par timo95 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/11/2011, 15h17
  2. [commons daemon] Service Java sous windows
    Par denisC dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 09/09/2011, 10h34
  3. naming service
    Par manuel dans le forum CORBA
    Réponses: 6
    Dernier message: 09/12/2002, 17h43
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo