#1 Le 22/02/2014, à 15:20
- Gaara
[résolu] savoir s'il y a des maj dispo en python
bonjour,
Quand je tape sur la console
apt-get -s dist-upgrade | grep -o '^[[:digit:]]\+'
le résultat est 1. (une mise à jour dispo)
En python,
>>> import subprocess
>>> p = subprocess.Popen("apt-get -s dist-upgrade | grep -o '^[[:digit:]]\+'", shell=True, stdin=None, stderr=None, executable="/bin/bash")
>>> 1
>>> resultat = p.communicate()
>>> print resultat
>>> (None, None)
Pourquoi?
Comment récupérer le "1" comme variable ?
Edit: Le nombre m'intéresse peu, ce que je voudrais savoir, c'est s'il y a des maj de disponible, pour l'intégrer à mon script.
Merci
Dernière modification par gaara92 (Le 22/02/2014, à 15:49)
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#2 Le 22/02/2014, à 15:43
- pingouinux
Re : [résolu] savoir s'il y a des maj dispo en python
Bonjour,
Essaye d'ajouter l'argument stdout à l'appel de subprocess.Popen
p = subprocess.Popen(....., stdout=subprocess.PIPE)
puis
resultat = p.communicate()[0]
Hors ligne
#3 Le 22/02/2014, à 15:49
- Gaara
Re : [résolu] savoir s'il y a des maj dispo en python
Génial, ça marche.
En plus la variable obtenue est une chaine donc c'est parfait.
Merci beaucoup pingouinux
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#4 Le 23/02/2014, à 22:38
- tiramiseb
Re : [résolu] savoir s'il y a des maj dispo en python
Salut,
J'arrive un peu tard, mais j'aimerais apporter la précision suivante : plutôt que d'utiliser Popen, utilise call, qui retourne directement le code d'erreur.
Ça donnerait donc :
>>> import subprocess
>>> print subprocess.call("apt-get -s dist-upgrade | grep -o '^[[:digit:]]\+'", shell=True)
>>> 1
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 23/02/2014, à 23:12
- Gaara
Re : [résolu] savoir s'il y a des maj dispo en python
Oui, ça marche aussi.
Merci !
J'ai modifié mon script, ça fait une ligne au lieu de trois.
Dernière modification par gaara92 (Le 23/02/2014, à 23:21)
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#6 Le 24/02/2014, à 06:46
- pingouinux
Re : [résolu] savoir s'il y a des maj dispo en python
Salut,
J'avais cru comprendre que gaara92 voulait récupérer dans une variable le "stdout" de la commande, et non son "code de retour". Maintenant j'ai un doute…
Hors ligne
#7 Le 24/02/2014, à 08:56
- tiramiseb
Re : [résolu] savoir s'il y a des maj dispo en python
Oh, oui, je pense que j'ai mal interprété la chose.
Enfin bon, il ne veut pas nécessairement connaître le nombre de mises à jour, il veut savoir s'il y en a, c'est tout.
Par contre ma solution ne lui dit pas s'il y a des mises à jour ou non, elle dit juste que la commande s'est bien exécutée...
J'imagine par exemple la ligne suivante pour valider s'il y a des mises à jour à exécuter ou non :
'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade'])
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 24/02/2014, à 09:34
- Gaara
Re : [résolu] savoir s'il y a des maj dispo en python
Oui, c'est pour vérifier s'il y a des maj, sinon mon script se ferme tout seul.
>>> import subprocess
>>> 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade'])
False
Donc pas de mise à jour, c'est aussi une alternative possible.
C'est quoi le mieux? Avoir une réponse en int ou en booleen? Sachant que dans le premier cas je dis: if p == 0 , ou dans le deuxieme je dirais: if p == False
J'ai posté mon script ici, si vous voulez voir le résultat.
(Je ne suis pas codeur pro, donc il doit y avoir beaucoup de trucs qui vous choqueront peut-être ! )
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#9 Le 24/02/2014, à 09:43
- tiramiseb
Re : [résolu] savoir s'il y a des maj dispo en python
C'est quoi le mieux? Avoir une réponse en int ou en booleen?
Ci-dessous, en gras les instanciations de nouveaux processus (fork)...
Avec ce que pingouinux propose (en se basant sur ta commande), ça fait la chose suivante :
1/ lancer un shell
2/ lui donner la ligne en question
3/ avec cette ligne, exécuter la commande "apt-get -s dist-upgrade"
4/ exécuter la commande "grep" pour ressortir
5/ lire la sortie standard pour avoir la valeur numérique sous forme de texte
6/ instancier la valeur chaîne en int
7/ comparer l'int avec la valeur 0
Avec ce que je propose, ça fait :
1/ lancer la commande "apt-get -s dist-upgrade"
2/ chercher la chaîne "Inst " est dans le retour de la commande
3/ voir si le retour de la recherche est positif ou négatif
Un fork contre trois.
À toi de voir...
dans le deuxieme je dirais: if p == False
Bah non, fais plutôt :
if not p
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 24/02/2014, à 09:59
- Gaara
Re : [résolu] savoir s'il y a des maj dispo en python
Oui, déjà j'ai remarqué que c'était plus rapide avec ta réponse du post #4.
Bah non, fais plutôt :
if not p
Donc ça ferait ça, si je comprend ? (car je ne comprend pas !)
p = 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade'])
if not p:
barreProgression.pbar.set_text('Pas de mise à jour disponible, arrêt')
Comment cette commande if not fonctionne ?
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#11 Le 24/02/2014, à 10:07
- tiramiseb
Re : [résolu] savoir s'il y a des maj dispo en python
Comment cette commande if not fonctionne ?
Ce n'est pas une commande.
"not" ça inverse la valeur booléenne, c'est tout.
"if not p", ça teste si la valeur de p n'est pas vraie (alors que "if p" testerait si la valeur de p est vraie).
Il n'y a pas nécessairement besoin d'une comparaison dans un test...
Chaque variable est soit vraie soit fausse.
Des exemples :
if 0 => faux
if 1 => vrai
if 'toto' => vrai
if '' => faux
if True => vrai
if False => faux
if not True => faux
if not False => vrai
Tu peux même faire :
if not 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']):
barreProgression.pbar.set_text('Pas de mise à jour disponible, arrêt')
Dans ce cas précis, découpe simplement par étapes :
1/ « subprocess.check_output(['apt-get', '-s', 'dist-upgrade']) » retourne le retour de la commande "apt-get -s dist-upgrade"
2/ « 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']) » retourne True si la chaîne "Inst " est trouvée dans le retour de la commande "apt-get -s dist-upgrade" et False si elle n'y est pas trouvée
3/ « not 'Inst ' in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']) » retourne False si la chaîne "Inst " est trouvée dans le retour de la commande "apt-get -s dist-upgrade" et True si elle n'y est pas trouvée
D'ailleurs Python permet même de rendre ça plus facilement lisible, de la manière suivante :
if 'Inst ' not in subprocess.check_output(['apt-get', '-s', 'dist-upgrade']):
... mais bon moi je n'aime pas cette formulation, je préfère garder la négation à l'extérieur de la vérification en question... question de goûts...
(PS : n'oublie pas le double-point à la fin de la ligne if !!!)
Dernière modification par tiramiseb (Le 24/02/2014, à 10:09)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#12 Le 24/02/2014, à 10:18
- Gaara
Re : [résolu] savoir s'il y a des maj dispo en python
ok merci, le résultat est effectivement plus rapide.
(PS : n'oublie pas le double-point à la fin de la ligne if !!!)
oui, j'oublie souvent
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne