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 :

subprocess aticon et python


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 168
    Points : 111
    Points
    111
    Par défaut subprocess aticon et python
    Bonjour, j'utilise subprocess, dans un programme en python, pour lancer une commande aticonfig pour obtenir la température de la carte graphique (aticonfig --od-gettemperature | grep Temperature | cut -c43-46). Quand je lance le programme python en direct ou bien via un shell je récupère (écriture dans un fichier log) la température que j'utilise ensuite dans le programme.
    Par contre si je schedule (avec cron ou autre), la commande aticonfig ne renvoie plus la température.
    Remarque : j'utilise 'echo pswrd | sudo -S.' pour lancer la commande
    Merci
    Il s'agit d'un repost, le premier était dans jeux....

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    à mon avis, tu donnes beaucoup d'infos mais pas les bonnes. Tu mélanges subprocess, aticonfig qui n'est pas une commande banale, des pipes (Unix) dans la commande, du shell et at/cron pour des lancements en différé.

    Bref, il y a des tonnes d'endroits où ça peut foirer et, très souvent, pour pas grand chose (1 caractère mal placé/oublié/en trop peut suffire à faire s'écrouler le chateau de cartes... Et le tout en français ...

    Commence par dédouaner (ou pas) aticonfig pipé avec plein de trucs en utilsant quelque chose (commande ou script) plus basique pour tester le "at" qui lance un script (shell ? python ?) qui utilise subprocess (quoi d'ailleurs ?). Déjà ...

    Une fois que ça marchera (si ça marche), attaque toi à aticonfig pipé avec ...

    Et poste du code ! Le problème est suffisamment ténu pour qu'une description en français ne suffise pas.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 168
    Points : 111
    Points
    111
    Par défaut
    Bonjour, effectivement par très claire ma question, voila déja le code python
    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
     
    import serial
    import os
    import logging
    import time
    import subprocess
     
    def chg(o):
    # sortie: stdout
        logging.basicConfig(
        filename='ctlfan.log',
        level=logging.INFO,
        format='%(asctime)s %(levelname)s - %(message)s',
        datefmt='%d/%m/%Y %H:%M:%S',
        )
        oo = o
        logging.info(oo)
        temp=int(float(oo) +.5)
        ser = serial.Serial('/dev/ttyUSB0', 9600 , timeout=1)
        ser.close()
        ser.open()
        ser.write("?")
        lecture=ser.readline()
        if "s10" in lecture :
            if temp > 60 :
                ser.write("s11")
                logging.info(oo + " S1 ON")
        elif "s11" in lecture :
            if temp < 50 :
                ser.write("s10")
                logging.info(oo + " S1 OFF")
        ser.close()
        return 0
     
    from subprocess import *    
    def get_status_output(cmd, input=None, cwd=None, env=None):
        pipe =  subprocess.Popen(cmd, shell=True, cwd=cwd, env=env, stdout=PIPE, stderr=STDOUT)
        output, errors = pipe.communicate(input=input)
        assert not errors
        return pipe.returncode, output
     
    def main():
        status, output = get_status_output('echo pswrd | sudo -S aticonfig --od-gettemperature | grep Temperature | cut -c43-46')
        chg(output)
        return 0
     
    if __name__ == '__main__':
        main()
    Quand j’exécute ce code en direct ou via un shell pas de problème mon fichier logs contient bien les infos (température etc..) , si je le fais via une tâche cron, dans le fichier logs j'ai bien la ligne avec le timestamp mais pas la température. J'ai rajouté l'utilisation de sudo parce que j'avais une erreur me disant qu'il n'y avait pas de serveur ou de lancer en root.
    Merci

  4. #4
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    j'ai reproduit un code analogue, avec une commande (celle passée à subprocess.Popen) plus simple et sans utilisation de serial. Via cron, ça fonctionne très bien.

    Par contre, je pense qu'il y a un problème avec sudo. Sudo ne lit pas son entrée standard quand, en interactif, il aurait demandé le mot de passe. Du coup le "echo $password | sudo ..." ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    plx@sony:~$ more only_root.sh 
    echo "execution fichier only_root.sh"
    plx@sony:~$ sudo chown root:root only_root.sh
    [sudo] password for plx:
    plx@sony:~$ sudo chmod 0700 only_root.sh
    plx@sony:~$ sudo ls -l only_root.sh 
    -rwx------ 1 root root 38 2012-01-20 08:52 only_root.sh
    j'ai mis mon mot de passe à "abcd" le temps de la manip

    Dans une autre fenêtre (pour que le mot de passe tapé lors du premier sudo ne soit plus actif et qu'il me demande effectivement le mot de passe):

    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
    plx@sony:~$ ./only_root.sh
    bash: ./only_root.sh: Permission non accordée
    plx@sony:~$ sudo ./only_root.sh
    [sudo] password for plx: 
    plx@sony:~$ 
    plx@sony:~$ # j'ai tapé CTRL-C sans saisir le mot de passe
    plx@sony:~$ 
    plx@sony:~$ echo "abcd" | sudo ./only_root.sh
    [sudo] password for plx: 
    plx@sony:~$ 
    plx@sony:~$ # ici aussi j'ai tapé CTRL-C sans saisir le mot de passe
    plx@sony:~$ # il me l'a bien demandé et ne s'est pas exécuté malgré le "echo ..." avant
    plx@sony:~$ 
    plx@sony:~$ sudo ./only_root.sh
    [sudo] password for plx: 
    execution fichier only_root.sh
    plx@sony:~$ 
    plx@sony:~$ # là j'ai tapé le bon mot de passe, ça fonctionne

    Donc, si il n'y a que ça comme problème dans ce que tu veux faire, il faut créer la tache dans crontab pour root et ne plus te servir de sudo (et evidemment virer le "echo xxx |")

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Je ne suis pas allé jusqu'au bout de la "démonstration" dans le message précédent :

    Voici le script python "nutix2003.py" analogue, pour ce qui nous occupe ici, au tien :

    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
    #!/usr/bin/env python
     
    import logging
    import subprocess
     
    def chg(output):
     
        logging.basicConfig(filename='/home/plx/nutix.log',
                            level=logging.INFO,
                            format='%(asctime)s %(levelname)s - %(message)s',
                            datefmt='%d/%m/%Y %H:%M:%S')
        logging.info(output)
     
    def get_status_output(cmd):
        pipe = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
        output, errors = pipe.communicate()
        assert not errors
        return pipe.returncode, output.strip()
     
     
    if __name__ == '__main__':
        code, out = get_status_output('echo "abcd" | sudo /home/plx/only_root.sh')
        chg(out)

    La ligne crontab utilisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    * * * * 5 /home/plx/nutix2003.py
    Ca s'exécute toutes les minutes, le Vendredi (5)

    Utilisation de crontab pour utilisateur non root :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    plx@sony:~$ crontab -e
    crontab: installing new crontab
    plx@sony:~$ date
    vendredi 20 janvier 2012, 09:48:22 (UTC+0100)
    plx@sony:~$ more nutix.log
    nutix.log: Aucun fichier ou dossier de ce type
    plx@sony:~$ date
    vendredi 20 janvier 2012, 09:49:07 (UTC+0100)
    plx@sony:~$ 
    plx@sony:~$ more nutix.log
    20/01/2012 09:49:01 INFO - sudo: no tty present and no askpass program specified
    plx@sony:~$ more nutix.log
    20/01/2012 09:49:01 INFO - sudo: no tty present and no askpass program specified
    20/01/2012 09:50:01 INFO - sudo: no tty present and no askpass program specified
    Arret contab pour plx, modification du script (supression du "echo xxx | sudo") et "re" crontab pour l'utilisateur root :

    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
    plx@sony:~$ sudo su
    root@sony:/home/plx# crontab -e
    no crontab for root - using an empty one
    root@sony:/home/plx# date
    vendredi 20 janvier 2012, 09:51:35 (UTC+0100)
    root@sony:/home/plx# more /home/plx/nutix.log 
    20/01/2012 09:49:01 INFO - sudo: no tty present and no askpass program specified
    20/01/2012 09:50:01 INFO - sudo: no tty present and no askpass program specified
    root@sony:/home/plx# date
    vendredi 20 janvier 2012, 09:52:05 (UTC+0100)
    root@sony:/home/plx# more /home/plx/nutix.log 
    20/01/2012 09:49:01 INFO - sudo: no tty present and no askpass program specified
    20/01/2012 09:50:01 INFO - sudo: no tty present and no askpass program specified
    20/01/2012 09:52:01 INFO - execution fichier only_root.sh
    root@sony:/home/plx#

Discussions similaires

  1. window 7 python subprocess.call() n'attend pas
    Par chticricri dans le forum Général Python
    Réponses: 2
    Dernier message: 12/03/2012, 18h13
  2. aticonfig subprocess and python
    Par nutix2003 dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 17/01/2012, 23h59
  3. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 13h32
  4. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 15h51
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 15h59

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