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 :

Problème lié à getopt.


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Problème lié à getopt.
    Bonjour,

    Je tente de faire un programme ayant pour but de prendre un argument au lancement du programme dans le but de l'utiliser dans une fonction pour lancer un mini timer sur celui-ci.

    Je montre ici le lancement de la fonction qui va permettre de prendre l'argument au lancement du programme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def main(argv):
       try:
          opts, args = getopt.getopt(argv,"t:",["times="])
       except getopt.GetoptError:
          print 'try.py -t <en secondes>'
          sys.exit(2)
       for opt, arg in opts:   
          if opt == '-t' :
             times = arg
    A partir de ca je fais une seconde fonction qui va lancer le timer en quelques sortes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def timerkill() :
       print "Launche proc2"
       print times
       time.sleep(times)
       print "Fin de proc2"    
       proc_1.terminate()
    Enfin je lance le core programme avec ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if __name__ == "__main__":
       main(sys.argv[1:])
       times = sys.argv[2]
       print times
    Je sais que la dernière partie est pas super propre mais je n'ai pas réussis à faire en sorte d'obtenir au minimum le timer lancé si je ne fabrique pas la variable times je me retrouve avec une erreur(indiquant que la variable times n'existe pas) donc j'ai fais ainsi.
    Dans l’extrême je vais mettre ici le programme entier pour comprendre si une erreur pourrait venir d'autre chose :

    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
    #!/usr/bin/python
    import socket
    import multiprocessing
    import time
    import sys,getopt
    #import signal
    def main(argv):
       try:
          opts, args = getopt.getopt(argv,"t:",["times="])
       except getopt.GetoptError:
          print 'try.py -t <en secondes>'
          sys.exit(2)
       for opt, arg in opts:   
          if opt == '-t' :
             times = arg
    #def ctrlc_handler(signum, frm) :
    #        print "Attendez la fin du timer."
    def listen() :
       while 1 :
          data = sock.recv(1024)
          ip_header = data[:20]
          ips = ip_header[-8:-4]
          source = '%i.%i.%i.%i' % (ord(ips[0]), ord(ips[1]), ord(ips[2]), ord(ips[3]))
          print 'Ping from %s' % source
    def timerkill() :
       print "Launche proc2"
       print times
       time.sleep(times)
       print "Fin de proc2"    
       proc_1.terminate()  
    host = ''
    if __name__ == "__main__":
       main(sys.argv[1:])
       times = sys.argv[2]
       print times
       sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
       sock.bind((host, 1))
       threads = []
    #  print "Installing signal handler...."
    #  signal.signal(signal.SIGINT, ctrlc_handler)
       proc_1 = multiprocessing.Process(name ='listen', target = listen)
       proc_2 = multiprocessing.Process(name='timerkill', target = timerkill)
       proc_1.start()
       proc_2.start()
    Alors pour faire simple le programme est supposé agir comme un serveur d'écoute qui va récupéré un ping et lorsque ce ping est détécté un timer est lancé avec la durée de l'argument au lancement du programme .

    Lorsque je lance celui-ci sans le timer je n'ai aucun soucis mais lorsque je demande l'argument pour un timer spécifique je me retrouve avec une erreur m'indiquant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    time.sleep(times)
    TypeError: a float is required
    Qu'en gros il faut que times soit une variable de type de float ?

    Je suis un peu perdu si jamais quelqu'un aurait une idée pour m'aider. Merci d'avance.

    Ps : Ne pas prendre en compte la fonction ayant pour but d'empecher l’interruption du programme avec ctrl+c

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Comme tu le constates, l'argument de time.sleep() doit être un float or l'argument que tu passes à ton programme en le lançant est une str()

    Donc il faut convertir : times = float(arg) et prendre en charge une éventuelle erreur de conversion bien sur.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'ai cru comprendre en effet mais j'ai une autre question par rapport à ce programme . Est-il possible normalement de lancer un processus depuis un autre processus ?Je m'explique.

    J'aimerais que lorsqu'une action est executé (ou est vrai par exemple) un processus se lance à ce moment . Par exemple on aurait ce processus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def proc1() :
    	print "Proc 1 ici!"
    Donc a la fin de ce processus est-il possible de faire en sorte de lancer un second processus par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def proc2() :
    	print "Proc 2 ici!"
    Ensuite on initialise les processus via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    d = multiprocessing.Process(name='proc1', target=proc1)
    n = multiprocessing.Process(name='proc2', target=proc2)
    Et enfin on lance ces processus normalement via start() .

    Mais j'aimerais savoir s'il serait possible de faire en sorte de lancer le second processus via le premier par exemple comme ca (désolé si c'est pas joli mais c'est pour illustré) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def proc1() :
    	print "Proc 1 ici!"
            n.start()
    Et dans le cas ou ca ne serait pas possible il y a pas un moyen via une fonction que je pourrais ne pas connaitre de pouvoir faire en sorte de faire cette chose ?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Euh oui, tu peux lancer proc_2 après une condition.

    Mais pourquoi utiliser multiprocessing alors ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    En fait c'est assz simple j'aimerais qu'un timer (via time.sleep) tourne sur un second processus pendant ce timer j'aimerais que le premier processus puisse faire son job.

    Par exemple dans ce programme j'aimerais que lorsqu' une ip est détécté celle-ci sois affiché normalement mais que le second processus soit lancé en même temps (le second processus aura pour but de lancer un timer) .
    A la fin du decompte du second processus (pendant que le premier affiche l'ip détécté en boucle si celle-ci existe toujours) faire en sorte de fermer ce premier processus (donc de fermer le socket)et de terminer enfin le programme .

    Je sais pas si j'ai été assez claire dans mon explication .

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par spykm Voir le message
    Par exemple dans ce programme j'aimerais que lorsqu' une ip est détécté celle-ci sois affiché normalement mais que le second processus soit lancé en même temps (le second processus aura pour but de lancer un timer) .
    A la fin du decompte du second processus (pendant que le premier affiche l'ip détécté en boucle si celle-ci existe toujours) faire en sorte de fermer ce premier processus (donc de fermer le socket)et de terminer enfin le programme .
    Salut

    Je ne sais pas si ça existe en Python mais en C moi je passerais par un alarm()
    1) je connecte le signal SIGALRM a une fonction dédiée via signal()
    2) je lance un alarm(le_temps_qui_va_bien)
    3) je gère mon IP
    Lorsque le temps tombe a 0, le système envoie un SIGALRM au processus. A ce moment là, la fonction dédiée prend en charge le truc et s'occupe de fermer la socket.
    Et tout ça se fait dans un seul processus (pas besoin d'un second qui va faire son sleep).

    Si ça peut se faire en C (toutefois exclusivement sur un système de type Unix) alors un truc analogue devrait pouvoir se faire en Python...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'ai compris le principe mais j'ai une question dans ce cas .

    Si lorsque tu fais un programme (dans ton cas en C) mais tu dois le rendre portable avec ce genre de fonction uniquement utilisable sous unix (pour ce cas) comment es-tu supposé faire pour pouvoir utiliser ce même programme sous windows (par exemple) ?

    Tu es obligé de refaire le programme en fonction de l'os?Ou tu dois refaire une fonction spécifique (dans ce cas précis un timer)universelle ?

    Désolé si je perd le file du sujet mais ça m’intéresse énormément .

    Merci dans tout les cas pour les réponses qui m'ont bien aidé.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je pense que le timer du module threading devrait suffire à ton besoin. Et très simple d'emploi qui plus est.

    http://docs.python.org/2/library/thr...#timer-objects

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par spykm Voir le message
    Si lorsque tu fais un programme (dans ton cas en C) mais tu dois le rendre portable avec ce genre de fonction uniquement utilisable sous unix (pour ce cas) comment es-tu supposé faire pour pouvoir utiliser ce même programme sous windows (par exemple) ?
    Ah je peux pas. Si j'utilise des mécanismes spécifiques Unix (fork/kill/signal/alarm/pipe) le programme ne fonctionnera que sous Unix. Et s'il doit fonctionner aussi sous Windows alors je ne pourrai pas utiliser ces mécanismes car ils n'ont pas été portés sous cet os.
    Dans ce cas il vaudra mieux faire le contraire et d'utiliser des mécanismes spécifiques Windows (thread) qui, eux, ont été portés sous Unix...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour vos réponses.

    Je vais en effet repasser avec les threads ce sera plus rapide grâce à ton link .

    Merci encore et bonne fin de journée à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec la fonction getoptions
    Par Hypnocrate dans le forum Langage
    Réponses: 5
    Dernier message: 31/03/2009, 23h05
  2. [ksh] Problème d'utilisation avec getopts
    Par 1Breton dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 13/08/2007, 12h13
  3. Problème de date avec Getopt
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 27/02/2007, 18h08
  4. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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