Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/02/2014, à 16: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, à 16: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, à 16: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, à 16: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, à 23: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

Hors ligne

#5 Le 24/02/2014, à 00:12

Gaara

Re : [résolu] savoir s'il y a des maj dispo en python

Oui, ça marche aussi.
Merci ! big_smile
J'ai modifié mon script, ça fait une ligne au lieu de trois.

Dernière modification par gaara92 (Le 24/02/2014, à 00: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, à 07: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, à 09: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'])

Hors ligne

#8 Le 24/02/2014, à 10: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 ! tongue)


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, à 10: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

Hors ligne

#10 Le 24/02/2014, à 10: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.

tiramiseb a écrit :

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, à 11: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, à 11:09)

Hors ligne

#12 Le 24/02/2014, à 11:18

Gaara

Re : [résolu] savoir s'il y a des maj dispo en python

ok merci, le résultat est effectivement plus rapide.

tiramiseb a écrit :

(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