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 :

Une bête erreur de syntaxe ? [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2021
    Messages : 3
    Par défaut Une bête erreur de syntaxe ?
    Bonjour,

    Après avoir attaquer un ensemble de tuto et de cours sur Python, j'ai décidé (d'enfin) me lancer dans la programmation.
    J'ai terminé d'écrire un script afin d'automatiser la configuration DHCP/DNS de mes VM qui sont sous Ubuntu 20.04. Seulement, je suis confronté à un message d'erreur de syntaxe quant à un "elif" mais je n'arrive pas à situer le problème, pouvez-vous m'aider à résoudre ce mystère ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for opt, arg in opts:
          if opt == '-h':
             print ('script_dhcp_dns.py -i pour le mode interactif"')
             sys.exit()
          elif opt in ("-d", "--domain"):
             domain = arg
    Mon "elif" est correctement indenté à la même hauteur que mon "if" qui le précède et c'est certainement très bête mais je perd un temps précieux depuis cet aprem à trouver une solution alors qu'il s'agit apparemment "que" d'un problème de syntaxe... d'autant que je cherche de long en large, certes au passage j'apprend des choses mais, je crois que me résoudre à confier mon script sera une meilleure solution.
    Nom : Sans titre 1.jpg
Affichages : 229
Taille : 10,6 Ko

    Souhaitant apprendre de mes erreurs, je vous remercie GRANDEMENT par avance de votre aide et de vos explications bienvenues

    A bientôt sur le forum

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    Il n'y a pas d'erreur dans le bout de code que vous avez posté.

    C'est facile à vérifier en le mettant dans un petit script et en initialisant opts à ce qu'on veut.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pb d'indentation variable? Si c'est 4 espaces, c'est 4 espaces partout.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Pb d'indentation variable? Si c'est 4 espaces, c'est 4 espaces partout.
    Le message d'erreur serait plus explicite...
    Là c'est plus un effet de bord du code qui est avant un peu comme quand on oublie de fermer une parenthèse mais en plus sioux.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2021
    Messages : 3
    Par défaut
    Merci pour vos réponses.
    Ci-dessous le script en entier (l'extrait se situe entre 109 et 114). J'aurais dû commencer par là plutôt qu'un extrait...
    Est-ce que le problème peut venir d'ailleurs bien que l'erreur indique un emplacement précis comme par répercussion ou je ne sais pas trop quoi ?

    D'ailleurs, si vous avez des conseils, ou autres qui vous sautent aux yeux, lors de la lecture du code, je suis totalement preneur !


    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
     
    #!/usr/bin/python
    # -*-coding:Latin-1 -*
     
    import sys, getopt
    import fileinput
    import os
    from socket import *
    import yaml
    import os.path
    import configparser 
     
     
    ###########	remplace des éléments	###########
    def replaceAll(file,searchExp,replaceExp):
        for line in fileinput.input(file, inplace=1):
            if searchExp in line:
                line = line.replace(searchExp,replaceExp)
            sys.stdout.write(line)
     
    ###########	DHCP	###########
    def dhcp_conf(server_name,subnet_mask,domain,option_dns,sous_res,interfaces):
    	os.system("apt-get install isc-dhcp-server")
     
    	fichier = open("/etc/dhcp/dhcpd.conf","w")
    	fichier.write("##### Option générale par défaut #####\n")
    	fichier.write("\n### RÉSEAU #####\n")
    	fichier.write("\nserver-name \""+server_name+"\";") #nom du serveur dns
    	fichier.write("\nauthoritative;")
    	fichier.write("\noption subnet-mask "+subnet_mask+";")
    	fichier.write("\noption domain-name \""+ domain +"\";")
    	fichier.write("\noption domain-name-servers "+ option_dns +";")
    	fichier.write("\nddns-update-style none;")
    	fichier.write("\ndefault-lease-time 3600;")
    	fichier.write("\nmax-lease-time 7200;")
    	fichier.write("\nlog-facility local7;\n")
    ###########	sous reseaux	###########
    	fichier.write("\n##### RÉSEAUX #####\n")
    	fichier.write("\n## Déclaration sous réseaux")
     
    	interfaces= ''
    	config = configparser.RawConfigParser() # On créé un nouvel objet "config"
    	config.read('res.ini')
     
    	i=0
    	for i in range(0,sous_res):
     
    		reseau = str("reseau"+str(i))
    		subnet = config.get(reseau,'subnet')
    		netmask = config.get(reseau,'netmask')
    		broadcast = config.get(reseau,'broadcast')
    		ntp = config.get(reseau,'ntp')
    		routers = config.get(reseau,'routers')
    		pool = config.get(reseau,'pool')
     
    		fichier.write("\nsubnet "+subnet+" netmask "+netmask+" {")
    		fichier.write("\n  option domain-name \""+domain+"\";")
    		fichier.write("\n  option broadcast-address "+broadcast+";")
    		fichier.write("\n  option ntp-servers "+ntp+";")
    		fichier.write("\n  option routers "+routers+";")
    		fichier.write("\n  range "+pool+";")
    		fichier.write("\n  ping-check = 1;")
    		fichier.write("\n}\n")
    	fichier.close()
     
    	replaceAll("/etc/default/isc-dhcp-server","INTERFACESv4=\"\"","INTERFACESv4=\""+interfaces+"\"")
    	os.system("service isc-dhcp-server restart")
     
    ###########	DNS	###########
    def dns_conf(domain,ip):
    	os.system("apt-get install bind9")
    	os.system("cp /etc/bind/db.local /etc/bind/"+domain)
     
    	a = open("/etc/bind/named.conf.local","w")
    	a.write("\nzone \""+domain+"\" {\n")
    	a.write("	type master;\n")
    	a.write("	file \"/etc/bind/"+domain+"\";\n")
    	a.write("	allow-query { any; };\n")
    	a.write("};")
    	a.close()
     
    	replaceAll("/etc/bind/"+domain,"localhost. root.localhost.","ns.site."+domain+". root."+domain+".")
    	replaceAll("/etc/bind/"+domain,"localhost.","ns")
    	replaceAll("/etc/bind/"+domain,"127.0.0.1",ip)
    	replaceAll("/etc/bind/"+domain,"@	IN	AAAA	::1","ns	IN	A	"+ip)	
    	f=open("/etc/bind/"+domain,"a")
    	f.write("www	IN	A	"+ip)
    	f.write("\nmailx	IN	A	"+ip)
    	f.write("\n@	IN MX 100 mailx."+domain+".")
    	f.close()
    	os.system("service bind9 restart")
     
    ###########	main	###########
    def main(argv):
     
       domain = ''
       ip = ''
       server_name = ''
       subnet_mask = ''
       option_dns = ''
       sous_res = ''
       interfaces = ''
     
       try:
          opts, args = getopt.getopt(argv,"hid:a:n:m:o:r:f:",["domain=","addr=","name=","mask=","optdns=","reseau=","interfaces="])
       except getopt.GetoptError:
          print ('script_dhcp_dns.py -i pour le mode interactif"')
          sys.exit(2)
       for opt, arg in opts:
          if opt == '-h':
             print ('script_dhcp_dns.py -i pour le mode interactif"')
             sys.exit()
          elif opt in ("-d", "--domain"):
             domain = arg
          elif opt in ("-a", "--addr"):
             ip = arg
          elif opt in ("-n", "--name"):
             server_name = arg
          elif opt in ("-m", "--mask"):
             subnet_mask = arg
          elif opt in ("-o", "--optdns"):
             option_dns = arg
          elif opt in ("-r", "--reseau"):
             sous_res = int(arg)
          elif opt in ("-f", "--interfaces"):
             interfaces = arg
          elif opt in ("-i", "--i"):
             domain = input("Entrez le nom de domaine : ")
             ip = input("Entrez l'ip du serveur dns : ")
             server_name = input("Entrez le nom du serveur DHCP : ") 
             subnet_mask = input("Entrez le masque : ")
             option_dns = input("Entrez les options dns : ")
             sous_res=int(input("Entrez le nombre de sous réseaux : "))
             interfaces=input("Entrez les interfaces d'écoute : ")
       dns_conf(domain,ip)
       dhcp_conf(server_name,subnet_mask,domain,option_dns,sous_res,interfaces)
     
     
    if __name__ == "__main__":
       main(sys.argv[1:])

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    mon python ne trouve pas d'erreur dans ce code... mais peut être que d'autres auront plus de chance.
    note: recopiez le code que vous avez posté et essayez vous même, vous avez peut être foutu un caractère parasite dans le code qui a été nettoyé par le copie/coller.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Pb d'indentation variable? Si c'est 4 espaces, c'est 4 espaces partout.
    Slt !
    Ca dépend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    x = 1
    y = 2
    if x:
      print(x) #2 espaces
    if y:
        print(y) #4 espaces
    if y+x:
    	print(y+x)  #1 tabulation
    Ca marche parfaitement

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Effectivement, quand j'ai répondu hier, je n'étais pas en situation d'essayer (d'où le "?"). Je constate ce matin que le code fourni fonctionne, malgré l'anomalie des indentations.
    ???

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par LeNarvalo Voir le message
    Ca marche parfaitement
    Exact. L'indentation de chaque bloc est indépendante de l'indentation des autres blocs. MAIS pour un bloc multi-lignes, toutes les lignes doivent être indentées de la même façon.

    Et sous P2 le mélange "espace/tabulation" était possible dans un même bloc mais avec la règle "une indentation pour 8 espaces". Fort heureusement cette possibilité (qui rendait un code potentiellement illisible sur un éditeur où la tabulation n'est pas configurée à 8 espaces) a disparu sous P3.

    Citation Envoyé par spleen1349 Voir le message
    Est-ce que le problème peut venir d'ailleurs bien que l'erreur indique un emplacement précis comme par répercussion ou je ne sais pas trop quoi ?
    Il peut arriver que l'erreur de la ligne (on va dire 100) se situe plus en amont (et ça arrive aussi aux compilateurs dans les progammes compilés). L'explication est assez simple: si la ligne (exemple 98) est mal terminée mais toujours valide, Python ne détecte pas de souci. Idem si cela se continue sur la ligne 99. Et c'est en arrivant sur la ligne 100, ligne correcte dans ta propre logique mais incorrecte dans celle de Python que là il t'indique un souci.

    Sinon il peut y avoir un caractère invisible que tu as malencontreusement tapé et que ton éditeur n'affiche pas. Dans ce cas le plus simple est d'effacer la ligne et la réécrire.

    Sinon euh... je suis étonné de voir coding: latin-1. Ton éditeur n'est pas en utf-8? Tu ne devrais pas laisser cette situation perdurer. L'utf-8 devient de plus en plus la norme de partout. D'ailleurs Ubuntu y est passé depuis au-moins 2018. Et tu devrais aussi écrire #!/usr/bin/env python3 et non #!/usr/bin/python déjà pour forcer Python3 (dans le cas où tu serais avec les deux Pythons encore actifs sur ton système) et surtout parce que env programme permet de chercher "programme" dans ton PATH alors que chemin/programme lui tape dans le chemin précisé ce qui nuit à la portabilité (si tu arrives sur une ature machine avec ton code mais que là le programme se trouve ailleurs...)
    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
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2021
    Messages : 3
    Par défaut
    Merci à l'ensemble des intervenants sur ma discussion et pour le temps que vous m'avez consacré. Je note la discussion comme résolu.

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

Discussions similaires

  1. Bête erreur de syntaxe mais je ne vois pas
    Par ETVigan dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2010, 18h37
  2. [Conception] Je n'arrive pas créé une table,erreur de syntax mais laquel
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/09/2006, 08h11
  3. Y aurait-il une erreur de syntaxe ?
    Par mpat dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 21/12/2005, 15h07
  4. Erreur de syntaxe sur la création d'une vue.
    Par cgougeon dans le forum Installation
    Réponses: 3
    Dernier message: 09/09/2005, 11h00
  5. Erreur de syntaxe dans une requete
    Par linou dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/08/2005, 12h44

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