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 :

Paramètres %s et %i


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Par défaut Paramètres %s et %i
    Bonjour à tous,

    Dans un script que j'ai récupéré, je rencontre une commande système qui est la suivante :

    ping %s -c 1 > /dev/null" %i.

    Toutefois je ne trouve pas de documentation sur les deux paramètres %s et %i

    J'ai bien trouvé cette documentation là, qui aborde les paramètres de positionnement.
    Toutefois nulle mention n'est faite à propos de %s et %i

    Sauriez-vous où est-ce que je pourrais trouver cela ?

    Merci à vous

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    manque le contexte car cette syntaxe n'existe pas en bash
    Après, n'importe quel interpréteur peut très bien remplacer ces %x par ce qu'il désire, par exemple:
    - %i est une variable dans une unit systemd
    - %i est une autre variable dans un lanceur .desktop
    - si tu nous induis en erreur en tronquant un printf ?

    ps: de plus, autant faire une copie exacte car ici, il est clair que tu as mal recopié ou fait une copie partielle qui justement change complètement le sens et ne fonctionnera pas (")

  3. #3
    Membre averti Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    manque le contexte car cette syntaxe n'existe pas en bash
    Après, n'importe quel interpréteur peut très bien remplacer ces %x par ce qu'il désire, par exemple:
    - %i est une variable dans une unit systemd
    - %i est une autre variable dans un lanceur .desktop
    - si tu nous induis en erreur en tronquant un printf ?

    ps: de plus, autant faire une copie exacte car ici, il est clair que tu as mal recopié ou fait une copie partielle qui justement change complètement le sens et ne fonctionnera pas (")
    Effectivement le %i est en dehors de la commande à proprement parler, ce qui change tout.
    Désolé pour le manque de contexte initial.

    Du coup je vais regarder la doc python et non Linux....

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    ici, c'est une question python

    Peut-être que la ligne suivante était plus claire ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("%s No response" %i)
    %i est la valeur de la variable i .
    python va remplacer la chaine %s par la valeur de i.
    En sortie , nous avons donc un truc du genre: 10.11.1.5 No response

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    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 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par novae84 Voir le message
    Dans un script que j'ai récupéré, je rencontre une commande système qui est la suivante : ping %s -c 1 > /dev/null" %i
    Cette commande ne fonctionne pas. Quand moi je la tape, j'obtiens "ping: %i: Nom ou service inconnu". Donc peut-être le script complet aiderait à comprendre le contexte. Ceci dit, le man de ping ne mentionne nulle part de "%s" ou "%i" donc déjà ça sent pas super bon concernant l'exactitude de la retranscription de ladite commande (et je ne voulais pas parler de ces guillemets ouverts et pas fermés mais je suis quand-même obligé car si on les rajoute, alors la commande devenant incomplète ne s'exécute plus).

    Citation Envoyé par novae84 Voir le message
    J'ai bien trouvé cette documentation là, qui aborde les paramètres de positionnement. Toutefois nulle mention n'est faite à propos de $s et $i
    Déjà "$s" et "$i" ce n'est pas "%s" et "%i". En shell le dollar symbolise l'accès à une variable (ou à une commande s'il est suivi de la commande entre parenthèses). Donc là encore cela laisse planer un doute sur la retranscription que tu nous fais ici de ce qui est écrit là bas. Toutefois j'ai présumé que tu étais en Bourne Shell, le shell le plus standard, mais peut-être que tu es dans un shell exotique tel que c-shell ou autre donc nous informer de ton shell standard sera un plus (echo $0 dans ton terminal). De même un script emportant avec lui son propre shell (ce qui permet à userX travaillant en shell X de pouvoir exécuter un script écrit par userY travaillant dans un shell Y), il serait bon que tu nous indiques le shell du script (la ligne #!truc au tout début du script, "truc" étant alors le shell utilisé par le script).

    Ensuite (toujours en Bourne Shell et ses héritiers, tels ksh, bash, ash, zsh) les paramètres de positionnement servent au programmeur d'un script shell, pas à son utilisateur. Grâce aux paramètres, le concepteur peut récupérer, dans son script, les éléments que l'utilisateur passera lorsqu'il appellera le script (même si bien souvent le concepteur et l'utilisateur sont la même personne)
    Cela nécessite de savoir se positionner tantôt dans la peau de l'utilisateur (qui tapera par exemple script.sh toto titi tata) et tantôt dans la peau du concepteur qui devra savoir où vont aller "toto", "titi" et "tata" (dans $1, $2 et $3, avec $* qui contiendra "toto titi tata" et $@ qui contiendra "toto" "titi" "tata" (tu noteras ici la subtilité entre $* qui récupère une grosse string unique et $@ qui récupère 3 petites strings) et $# qui contiendra 3). Mais tout cela n'a rien à voir quand on appelle un programme déjà existant (donc créé par un autre programmeur). Là on l'appelle simplement, en lui passant les arguments que l'on souhaite, en espérant que le programmeur aura pris soin lui de les prendre en compte correctement. Exemple quand tu appelles mkdir truc tu ne te poses pas de question, c'est implicite dans ton esprit que le concepteur de "mkdir" a fait en sorte que "truc" soit bien récupéré pour être traité.
    Et les paramètres de positionnement sont donc $1, $2, $3, ..., $nnn (nnn étant 9 en Bourne Shell et j'ai oublié jusqu'à combien on peut aller dans ses héritiers plus évolués mais c'est beaucoup), plus $*, $@ et $# et c'est tout. Nulle part on parle de "$s" ou "$i" (ni %s ou %i). Eventuellement on pourra voir du "%s" et "%i" dans la commande printf fonctionnant exactement comme la fonction printf() du C mais chaque commande ayant sa propre syntaxe, on ne peut pas généraliser de l'une vers l'autre (printf ce n'est pas ping).
    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]

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Les remarques déjà faites sont très bonnes. Une hypothèse non évoquée : Cette ligne ne serait-elle pas issu d'un script MSDOS ? C'est leur façon de signifier une variable, n'est-ce pas ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Cette ligne ne serait-elle pas issu d'un script MSDOS ? C'est leur façon de signifier une variable, n'est-ce pas ?
    Avec 1 recherche Internet vite faite on tombe sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    utils.execute("ping -c1 -w1 %s > /dev/null; echo $?", vpn['private_dns_name'])
    os.system("ping -q -c1 -W1 %s > /dev/null" % Computer)
    subprocess.call('ping -q -c1 -W 1 '+ device + ' > /dev/null', shell=True)
    on peut presque dire que @novae84 a fait 1 mauvais copié-collé et est assez débutant pour ne pas connaître les "placeholders" % (... il ne sait pas délimiter 1 chaîne de caractères)

  8. #8
    Membre averti Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Par défaut
    Je vous remercie de vos réponses.

    Tout d'abord, excusez moi pour la confusion, j'ai fait une erreur de dyslexie dans l'exposé de mon problème, il s'agit donc bien de %s et %i et non $i et $s.

    Par rapport au dernier message, je confirme également que je suis débutant.
    J'essaie donc de récupérer ça et là du code qui correspond à ce que je veux faire, puis le décomposer pour mieux le comprendre et développer mes propres outils par la suite.


    Concernant le script, je ne l'avais pas posté pour éviter de surcharger, mais le voici :
    Il s'agit d'un petit programme python qui effectue un ping sur toutes les adresses IP d'un sous réseau est renvoie "Is alive" ou "No response" en fonction de la réponse au ping.

    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
     
      GNU nano 6.3                                                    sweep.py                                                             
    # Short script to perform a ping sweep of a target IP range.
    #!/usr/bin/python
     
    import ipaddress
    import os
     
    network = ipaddress.ip_network(str("10.11.1.0/24"))
     
    print("Running ping sweep of target IP range 10.11.1.0/24")
     
    for i in network.hosts():
     
            response = os.system("ping %s -c 1 > /dev/null" %i)
     
            if response == 0:
                    print("%s Is alive" %i)
            else:
                    print("%s No response" %i)
     
    print("Ping sweep complete")
     
    exit()


    Concernant la commande système en elle même :
    "ping %s -c 1 > /dev/null" %i.

    De ce que je comprends (ou crois comprendre), c'est qu'elle récupère le contenu de network.host() ((une liste d'IP, in fine))
    Elle traite ensuite chaque élément de la liste (récupéré avec %s je suppose?) , puis effectue une seule requete ICMP, et elle renvoie la sortie de la commande dans /dev/null.
    Et je ne sais pas ce qu'elle fait avec %i .

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par novae84 Voir le message
    Et je ne sais pas ce qu'elle fait avec %i .
    C'est du Python

    Les dév Python peuvent mieux te répondre, mais en gros

    os.system("ping %s -c 1 > /dev/null" % i) le % permet de séparer la chaine de caractères à "trous" des paramètres.
    Donc, tu vas remplacer %s par la valeur de i, i étant la variable de boucle qui va prendre comme valeur, tous les hôtes du réseau.

    C'est la même chose pour les 2 affichages, print("%s Is alive" %i) et print("%s No response" %i)

  10. #10
    Membre averti Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Par défaut
    Bon j'ai honte ...
    Je ne sais pas pourquoi j'ai bloqué sur cette portion de code spécifiquement, en focalisant sur la commande.
    Alors que les lignes print("%s Is alive" %i) et print("%s No response" %i) utilisent le même système.

    Je comprends beaucoup mieux mon erreur à présent, je vous remercie pour votre aide.

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

Discussions similaires

  1. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11
  2. [xmlrad] Pb de paramètre ?
    Par Pm dans le forum XMLRAD
    Réponses: 7
    Dernier message: 07/01/2003, 14h37
  3. [SWT] Problème de paramètre GridData
    Par yolepro dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 06/12/2002, 10h37
  4. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47
  5. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24

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