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 :

Aide pour écriture dans un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut Aide pour écriture dans un fichier
    Bonjour,

    Pour mon travail, je dois faire un script qui ajoute automatiquement des adresses IP dans le fichier LMhosts sous windows.
    J'ai commencé mon travail et j'ai réussi à pondre un script.
    Tout fier je me dis chouette j'ai réussi mais à force de l'utiliser j'ai remarqué plusieurs choses qui ne marchent pas.
    J'ai créé une liste qui contient l'IP, le nom du poste et le suffixe #PRE.
    L'IP est dans une variable que je modifie dans une fenêtre et le reste codé en dur dans le script.
    Le hic c'est que quand je mets pas d'IP, le codé en dur s'affiche quand même.

    Donc je demande de l'aide sur comment procéder, comment fait pour que quand je mets pas d'adresse IP ça ne s'affiche pas dans le lmhosts.

    Et deuxième question, y-a-t'il un moyen de simplifier le tout notamment la partie du Tkinter?

    Merci pour votre aide.

    Voici mon code :

    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
    from tkinter import *
     
    def lmhost():
        fileName = "c:/windows/System32/Drivers/Etc/lmhosts"
        #fileName = 'c:/test/lmhosts'       # Nom du fichier a modifier
     
        ipN1 = entr1.get()                   # Variables d'entrees
        ipC1 = entr2.get() 
        ipC2 = entr3.get()
        ipC3 = entr4.get()
        ipC4 = entr5.get()
        ipC5 = entr6.get()
        ipC6 = entr7.get()
        ipC7 = entr8.get()
        ipC8 = entr9.get()
        ipC9 = entr10.get()
     
        data = ('\r', ipN1,'     N1     #PRE','\r', ipC1,'     C1     #PRE','\r', ipC2,'     C2     #PRE','\r', ipC3,'     C3     #PRE','\r', ipC4,'     C4     #PRE','\r', ipC5,'     C5     #PRE','\r', ipC6,'     C6     #PRE','\r', ipC7,'     C7     #PRE','\r', ipC8,'     C8     #PRE','\r', ipC9,'     C9     #PRE')     # Données à mettre dans le fichier + retour à la ligne
     
        file = open(fileName, "a")          # Ouverture en écriture en mode ajout
        contenu = file.writelines(data)     # Ecriture dans le fichier 
        print(contenu)
        file.close()                        # Fermeture du fichier
     
    def quitter(event):                     # Fonction quand on appuie sur ESC la fenetre se ferme
        quitter = event.widget
        fen.destroy()
     
    def executer(event):                    # Fonction quand on appuie sur Enter le programme se lance
        executer = event.widget
        lmhost()
     
    fen = Tk()
    fen.title('Modification LmHosts')                  # Titre de la fenetre
    fen.config(bg='grey')                              # couleur de fond de la fenetre
    fen.grab_set()                                     # Verifier a quoi ca sert ????
    fen.focus_set()                                    # Donne le focus a un widget
    fen.resizable(width=False, height=False)           # Empeche le redimensionnement de la fenetre
     
    text0 = Label(fen, text='Entrer les IP des Postes :', bg='red')
    text0.grid( row=0, column=0)
     
     
    text1 = Label(fen, text='N1 :',  fg='blue')
    text1.grid( row=2, sticky=W)
    entr1 = Entry(fen, takefocus=1)
    entr1.grid( row=2, column=1)
    entr1.insert(0, '10.x.x.96')
     
    text2 = Label(fen, text='C1 :', fg='blue')
    text2.grid( row=3, sticky=W)
    entr2 = Entry(fen, takefocus=1)
    entr2.grid( row=3, column=1)
    entr2.insert(0, '10.x.x.105')
     
    text3 = Label(fen, text='C2 :', fg='blue')
    text3.grid( row=4, sticky=W)
    entr3 = Entry(fen, takefocus=1)
    entr3.grid( row=4, column=1)
    entr3.insert(0, '10.x.x.106')
     
    text4 = Label(fen, text='C3 :', fg='blue')
    text4.grid( row=5, sticky=W)
    entr4 = Entry(fen, takefocus=1)
    entr4.grid( row=5, column=1)
    entr4.insert(0, '10.x.x.107')
     
    text5 = Label(fen, text='C4 :', fg='blue')
    text5.grid( row=6, sticky=W)
    entr5 = Entry(fen, takefocus=1)
    entr5.grid( row=6, column=1)
    entr5.insert(0, '10.x.x.108')
     
    text6 = Label(fen, text='C5 :', fg='blue')
    text6.grid( row=7, sticky=W)
    entr6 = Entry(fen, takefocus=1)
    entr6.grid( row=7, column=1)
    entr6.insert(0, '10.x.x.109')
     
    text7 = Label(fen, text='C6 :', fg='blue')
    text7.grid( row=8, sticky=W)
    entr7 = Entry(fen, takefocus=1)
    entr7.grid( row=8, column=1)
    entr7.insert(0, '10.x.x.110')
     
    text8 = Label(fen, text='C7 :', fg='blue')
    text8.grid( row=9, sticky=W)
    entr8 = Entry(fen, takefocus=1)
    entr8.grid( row=9, column=1)
    entr8.insert(0, '10.x.x.111')
     
    text9 = Label(fen, text='C8 :', fg='blue')
    text9.grid( row=10, sticky=W)
    entr9 = Entry(fen, takefocus=1)
    entr9.grid( row=10, column=1)
    entr9.insert(0, '10.x.x.112')
     
    text10 = Label(fen, text='C9 :', fg='blue')
    text10.grid( row=11, sticky=W)
    entr10 = Entry(fen, takefocus=1)
    entr10.grid( row=11, column=1)
    entr10.insert(0, '10.x.x.113')
     
    text11 = Label(fen, text='')                                       # creer un espace
    text11.grid( row=12, column=0)
     
    bout1 = Button(fen, text='Quitter', command=fen.destroy)           # ou command=fen.quit
    bout1.grid( row=13, column=1)
    bout1.bind_all("<Escape>", quitter)                                # Touche ESC pour quitter le programme
     
    bout2 = Button(fen, text='Executer',width=10,  command=lmhost)
    bout2.grid( row=13, column=0)
    bout2.bind_all("<Return>", executer)                               # Touche Enter pour executer le programme
     
    fen.mainloop()

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Code python : 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
     
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    def lmhost():
        #fileName = "c:/windows/System32/Drivers/Etc/lmhosts"
        fileName = 'c:/temp/lmhosts'       # Nom du fichier a modifier
     
        content = ""
        for i, entry in enumerate(entries):
            entry_text = entry.get()
            #print("[*] Entry: ", entry_text)
            if entry_text != "":
                content += "\r{}\t{}\t#PRE".format(entry_text, labels[i])
     
        with open(fileName, "a") as f:
            f.writelines(content)
     
    def quitter(event):                     # Fonction quand on appuie sur ESC la fenetre se ferme
        quitter = event.widget
        fen.destroy()
     
    def executer(event):                    # Fonction quand on appuie sur Enter le programme se lance
        executer = event.widget
        lmhost()
     
    fen = Tk()
    fen.title('Modification LmHosts')                  # Titre de la fenetre
    fen.config(bg='grey')                              # couleur de fond de la fenetre
    fen.grab_set()                                     # Verifier a quoi ca sert ????
    fen.focus_set()                                    # Donne le focus a un widget
    fen.resizable(width=False, height=False)           # Empeche le redimensionnement de la fenetre
     
    text0 = Label(fen, text='Entrer les IP des Postes :', bg='red')
    text0.grid( row=0, column=0)
     
    labels = ("N1", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9")
    ip_final = ("96", "105", "106", "107", "108",  "109", "110", "111", "112", "113")
    row_start = 2
     
    entries = list()
     
    for row_num, entry_label in enumerate(labels):
        text = Label(fen, text = entry_label + " :", fg="blue")
        text.grid(row = row_num + row_start, sticky=W)
        entry = Entry(fen, takefocus=1)
        entry.grid(row = row_num + row_start, column = 1)
        entry.insert(0, "10.x.x.{}".format(ip_final[row_num]))
        entries.append(entry)
     
    text11 = Label(fen, text='')                                       # creer un espace
    text11.grid( row=12, column=0)
     
    bout1 = Button(fen, text='Quitter', command=fen.destroy)           # ou command=fen.quit
    bout1.grid( row=13, column=1)
    bout1.bind_all("<Escape>", quitter)                                # Touche ESC pour quitter le programme
     
    bout2 = Button(fen, text='Executer',width=10,  command=lmhost)
    bout2.grid( row=13, column=0)
    bout2.bind_all("<Return>", executer)                               # Touche Enter pour executer le programme
     
    fen.mainloop()

    En premier lieu j'ai factorisé le code de création des labels. Quand du code se répète avec des changements minimaux le plus simple est de le mettre dans une boucle.

    Dans ce cas précis j'ai utilisé la fonction enumerate(). Chacune des entrées (entry) est insérée dans une liste (entries) qui resservira dans la fonction lmhost().

    Dans la fonction lmhost(), je récupère chacune des entrées (encore une fois via enumerate()) et si le texte de l'entrée est vide alors on ne l'ajoute pas au contenu à écrite (content).

    Autre possibilité (non utilisée, mais qui serait plus efficace), utiliser une regexp pour voir si le texte correspond bien à une adresse IP: si c'est la cas, on ajoute à "content", sinon, on ne fait rien.

    Pour le formatage des chaines, j'utilise str.format(), que je préfère à l'ancienne méthode.

    P.S: code fonctionnel et testé sous Python 3.2. Peut être à changer pour les anciennes versions...

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Et bien...
    J'avais tester cela ce matin mais sous un autre angle.
    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
    try:
        from tkinter import *
    except:
        from Tkinter import *
     
    def lmhost(event=None):
        #fileName = "c:/windows/System32/Drivers/Etc/lmhosts"
        fileName = 'c:/temp/lmhosts'
     
        for entry in (widget for widget in fen.winfo_children()
            if isinstance(widget, Entry)):
                with open(fileName, "a") as f:
                    for lab in fen.grid_slaves(entry.grid_info()['row'],
                        str(int(entry.grid_info()['column']) - 1)):
                        if (lab['text'][:2], entry.get()) not in adresses:
                            f.write('\r' + entry.get() + '    '  +
                                lab['text'][:2] + '    #PRE')
     
    def quitter(event):
        fen.quit()
     
    adresses = [('N1', '10.x.x.96'), ('C1', '10.x.x.105'),
        ('C2', '10.x.x.106'), ('C3', '10.x.x.107'), ('C4', '10.x.x.108'),
        ('C5', '10.x.x.109'), ('C6', '10.x.x.110'), ('C7', '10.x.x.111'),
        ('C8', '10.x.x.112'), ('C9', '10.x.x.113')]
     
    fen = Tk()
    fen.title('Modification LmHosts')
    fen.resizable(width=False, height=False)
    fen.bind_all("<Escape>", quitter)
     
    Label(fen, text='Entrer les IP des Postes :', bg='red').grid(row=0,
        column=0, columnspan=2, padx=5, pady=5, sticky=W)
     
    for index, elem in enumerate(adresses):
        Label(fen, text=elem[0] + ' :', fg='blue').grid(row=index+2,
            sticky=W, padx=5)
        e = Entry(fen)
        e.grid(row=index+2, column=1, padx=5)
        e.insert(0, elem[1])
     
    Button(fen, text='Quitter', command=fen.quit).grid(row=13, column=1,
        padx=5, pady=15, sticky=E)
     
    bout2 = Button(fen, text='Executer',width=10,  command=lmhost)
    bout2.grid(row=13, column=0, padx=5, pady=15, sticky=W)
    fen.bind_all("<Return>", lmhost)
     
    fen.mainloop()
    Le repas a sonner le glas du remplacement du isinstance

    Le coté tk est peut être plus juste.
    @+

  4. #4
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Merci beaucoup pour vos réponses.
    Je suis heureux de cette entraide sur ce forum.

    Je vais aller de ce pas étudier les codes proposés et essayer de les comprendre
    Je débute de zéro donc je dois mettre les bouchés doubles pour comprendre.

    Je vais les tester et vous revenir avec suremment des questions.

    Merci encore

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par tbr67fr Voir le message
    Je débute de zéro donc je dois mettre les bouchés doubles pour comprendre.
    Hmmm... Ben du coup je me dit que j'aurais du commenter le code...

    Pour commencer j'ai enlever
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fen.config(bg='grey')                              # couleur de fond de la fenetre
    fen.grab_set()                                     # Verifier a quoi ca sert ????
    fen.focus_set()
    le 'grey' est plus clair que celui des Widgets qui le recouvrent (du moins chez moi). Je n'en vois pas l'utilité si ce n'est pas appliquer à chaque Widget.
    .grab_set() sert a capturer (ici pour fen) les events souris/clavier. Je pense en particulier dans ton code aux bind.
    focus_set donne le focus à fen.

    J'ai déplacer le bind_all

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fen.bind_all("<Escape>", quitter)

    Donc (all) pour tous les enfants de fen.

    J'ai modifier quitter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def quitter(event):
        fen.quit()
    destroy détruit le Widget.
    quit arrète le mainloop (arrête l'interpréteur tcl en fait), et comme il n'y a rien après...
    Je trouve cela plus propre.

    J'ai supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def executer(event):                    # Fonction quand on appuie sur Enter le programme se lance
        executer = event.widget
        lmhost()
    Autant aller directement au but

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fen.bind_all("<Return>", lmhost)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def lmhost(event=None):

    Dans tous les cas nous n'avons pas besoin de l'event.

    Comme Neitsa j'ai utiliser le fait que les listes ai un index pour créer les Label et Entry. Cela est utiliser par la suite pour comparer les ip.

    Comme enumerate commence à 0 je fais un row=index+2

    A noter que je ne nomme pas les Widgets dont je n'ai pas l'utilité en Python.
    J'ai laisser bout2 pour l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Button(fen, text='Quitter', command=fen.quit).grid(row=13, column=1,
        padx=5, pady=15, sticky=E)
     
    bout2 = Button(fen, text='Executer',width=10,  command=lmhost)
    bout2.grid(row=13, column=0, padx=5, pady=15, sticky=W)
    Est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Button(fen, text='Quitter', command=fen.quit).grid(row=13, column=1,
        padx=5, pady=15, sticky=E)
     
    Button(fen, text='Executer',width=10,  command=lmhost).grid(row=13, column=0, padx=5, pady=15, sticky=W)
    La méthode command est connue du Widget.

    J'ai supprimer text11 au profit de padx/pady.

    J'ai enlever les takefocus=1 qui sont inutiles.

    Les différences avec le code de Neitsa sont dans la fonction lmhosts.
    Comme je n'ai pas créer un liste des Entry (entries) je récupères celles ci dans la liste des Widget de fen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for entry in (widget for widget in fen.winfo_children()
            if isinstance(widget, Entry)):
    Même utilisation de with pour ouvrir le fichier. Il s'occuper de fermer le fichier.
    J'utilise les infos du géométry manager (ici grid) pour trouver le Widget (Label) de gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    for lab in fen.grid_slaves(entry.grid_info()['row'],
                        str(int(entry.grid_info()['column']) - 1)):
    Et si le tuple (Texte du Label, Texte du l'Entry) n'est pas dans la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        if (lab['text'][:2], entry.get()) not in adresses:

    Je l'inscrit dans le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                            f.write('\r' + entry.get() + '    '  +
                                lab['text'][:2] + '    #PRE')
    lab['text'][:2] ne prend que les deux premiers caractères du text du label car je n'ai pas besoin du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label(fen, text=elem[0] + ' :'

    Le .format de tbr67fr semble plus intéressant mais j'ai préféré travailler avec du texte brut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '\r' + entry.get() + '    '  + lab['text'][:2] + '    #PRE'

    C'est moins 'pro' mais j'ai penser que c'était plus compréhensible pour toi.
    Le résultat est différent : le \t du format donne une tabulation, le texte brut le même résultat que dans ton exemple.

    La solution de la liste pour les Entry est sans doute plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        contenu = file.writelines(data)     # Ecriture dans le fichier 
        print(contenu)
    Est inutile car file.writelines(data) retourne None

    Pour finir je dirais que pour le code présent le from x import * est sans conséquence mais il serait bon de prendre l'habitude de faire soit un import tout cours soit un import x as y pour bien différencier tout cela.

    N'hésite pas pour les questions.

    @+

  6. #6
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Salut,

    Ok j'ai essayé vos codes et ils fonctionnent bien. Merci.

    Pour ton code PauseKawa j'ai été obligé de remettre le fen.destroy() car avec .quit la fenêtre ne se ferme pas ça plante.
    J'ai regardé ton code et je suis impressionné de comment tu imbriques tout ça.
    Si j'ai bien compris tout ce qui je tape dans la case et qui n'est pas pareil à la liste tu l'écris dans le fichier et donc si je tape rien, rien ne s'écrit.

    J'ai essayé de mettre des noms de postes différents du genre bureau1 et poste1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (lab['text'][:7], entry.get()) not in adresses:
                            f.write('\r' + entry.get() + '    '  +
                                lab['text'][:7] + '    #PRE')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    adresses = [('Bureau1', '10.x.x.96'), ('Bureau2', '10.x.x.97'), ('Bureau3', '10.x.x.98'),
        ('Bureau4', '10.x.x.99'), ('Bureau5', '10.x.x.100'), ('Poste1 ', '10.x.x.101'),
        ('Poste2 ', '10.x.x.102'), ('Poste3 ', '10.x.x.103'), ('Poste4 ', '10.x.x.104'),
        ('Poste5 ', '10.x.x.105'), ('Poste6 ', '10.x.x.106'), ('Poste7 ', '10.x.x.107'),
        ('Poste8 ', '10.x.x.108'), ('Poste9 ', '10.x.x.109')]
    La seule chose que j'ai remarqué c'est que si la longueur des 2 noms est différente (7 et 6) ça cause problème. Donc pour corriger ça j'ai mis des espaces pour avoir la même longueur et la c'est ok.

    La j'aimerais essayer de rajouter une fonction qui va automatiquement transferer par réseau le lMhosts aux postes designés. Genre rajouter une case à cocher pour dire oui je veux faire le transfert.

    Je vais vous revenir avec un morceau de code

    Merci beaucoup pour votre aide, j'avance doucement mais surement.

  7. #7
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Salut,

    Ok je viens de rajouter une petite définition pour l'envoi de fichier sur les postes du réseau local.
    Ca marche mais j'ai beau chercher mais je sais pas comment faire pour qu'il l,envoie à plusieurs postes.
    Avec shutil.copy() je peux que choisir un répertoire et si j'en mets plusieurs j'ai une erreur.

    Voici le code :

    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
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    try:
        from tkinter import *
    except:
        from Tkinter import *
    import shutil
     
    def lmhost(event=None):
        global fileName
        fileName = 'c:/windows/System32/Drivers/Etc/lmhosts'
     
        for entry in (widget for widget in fen.winfo_children()
            if isinstance(widget, Entry)):
                with open(fileName, "a") as f:
                    for lab in fen.grid_slaves(entry.grid_info()['row'],
                        str(int(entry.grid_info()['column']) - 1)):
                        if (lab['text'][:-2], entry.get()) not in adresses:
                            f.write('\r' + entry.get() + '    '  +
                                lab['text'][:-2] + '    #PRE')
        envoi()                    
     
    def quitter(event):
        fen.destroy()
     
    def envoi():
        dst = '//Bureau1/Users/Public'
        copie = shutil.copy(fileName, dst)
     
     
    adresses = [('Bureau1', '10.x.x.96'), ('Bureau2', '10.x.x.97'), ('Bureau3', '10.x.x.98'),
        ('Bureau4', '10.x.x.99'), ('Bureau5', '10.x.x.100'), ('Poste1 ', '10.x.x.101'),
        ('Poste2 ', '10.x.x.102'), ('Poste3 ', '10.x.x.103'), ('Poste4 ', '10.x.x.104'),
        ('Poste5 ', '10.x.x.105'), ('Poste6 ', '10.x.x.106'), ('Poste7 ', '10.x.x.107'),
        ('Poste8 ', '10.x.x.108'), ('Poste9 ', '10.x.x.109')]
     
    fen = Tk()
    fen.title('Modification LmHosts')
    fen.resizable(width=False, height=False)
    fen.bind_all("<Escape>", quitter)
     
    Label(fen, text='Entrer les IP des Postes :', bg='red').grid(row=0,
        column=0, columnspan=2, padx=5, pady=5, sticky=W)
     
    for index, elem in enumerate(adresses):
        Label(fen, text=elem[0] + ' :', fg='blue').grid(row=index+2,
            sticky=W, padx=5)
        e = Entry(fen)
        e.grid(row=index+2, column=1, padx=5)
        e.insert(0, elem[1])
     
    Button(fen, text='Quitter', command=fen.destroy).grid(row=17, column=1,
        padx=5, pady=15, sticky=E)
     
    bout2 = Button(fen, text='Executer',width=10,  command=lmhost).grid(row=17,
        column=0, padx=5, pady=15, sticky=W)
    fen.bind_all("<Return>", lmhost)
     
    fen.mainloop()
    Existe-t'il une autre fonction que shutil.copy pour envoyer un fichiers sur plusieurs PC?

    Merci.

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    adresses = [('Bureau1', '10.x.x.96'), ('Bureau2', '10.x.x.97'),
        ('Bureau3', '10.x.x.98'), ('Bureau4', '10.x.x.99'),
        ('Bureau5', '10.x.x.100'), ('Poste1', '10.x.x.101'),
        ('Poste2', '10.x.x.102'), ('Poste3', '10.x.x.103'),
        ('Poste4', '10.x.x.104'), ('Poste5', '10.x.x.105'),
        ('Poste6', '10.x.x.106'), ('Poste7', '10.x.x.107'),
        ('Poste8', '10.x.x.108'), ('Poste9', '10.x.x.109')]
     
    for dest in adresses:
        print '//' + dest[0] + '/Users/Public'
    (Et oubliez les espaces)

  9. #9
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Salut,

    Merci pour ton dernier petit code, ça formatte l'adresse comme je veux (//bureau1/ etc..).
    J'ai crée une définition d'envoi de fichiers à tous les postes sauf qu'il n'envoie rien et j'ai pas de message d'erreur. Bizarre.

    Voici le morceau de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def envoi():
        for dest in adresses:
            lien = str(print('//' + dest[0] + '/Users/Public'))
            copie = shutil.copy('c:/windows/System32/Drivers/Etc/lmhosts', lien)
    Y a t'il une erreur dans mon code?

    Je constate que j'ai tellement de chose à apprendre encore. Pour chaque option que je veux rajouter je butte sur un problème. Pas toutes les recherches google m'aide à trouver la solution ou une piste
    C'est pour ça que je vous demande de l'aide.
    J'espère que je vous lasse pas avec toutes mes questions.

    Merci et à plus.

  10. #10
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    En fait j'attendais votre message.
    shutil (Basé sur os) est un module pour copier les fichiers et dossiers. Pensez vous que cela soit possible aussi simplement via le réseau ?

    @+

  11. #11
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Salut,

    Là tu me mèles car j'ai déjà fait un autre programme et ça a fonctionné.

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    # -*- coding: utf8 -*-
     
    import os, shutil
     
    dstdir = ['//c1/c1_c/win/', '//F/Public/test/']     # Répertoire distant dans une liste
     
    local = 'c:/l/list.ini'              # Fichier Local à copier
     
    for rep in range(0, 7):                    # Compteur de 0 à 6
        if os.path.exists(dstdir[rep]):        # Si le répertoire existe alors
            shutil.copy2(local, dstdir[rep])   # copier le fichier dans les répertoires
    Donc j'aurais tendance à dire oui.
    Mais vu ta réponse ça doit être plus compliqué

  12. #12
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    lien = str(print('//' + dest[0] + '/Users/Public/')) ne fonctionne pas mieux ?

    @+

  13. #13
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2011
    Messages : 31
    Par défaut
    Allo,

    Quand je fais un print(lien) il me retourne un None.
    C'est pour ça qu'il transfert rien.

    C'est ce que WingIde me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Bureau1/Users/Public/
    None
    Sais-tu pourquoi il me retourne None avec un print(lien)?

    Merci

Discussions similaires

  1. Problème pour écriture dans un fichier
    Par nekcorp dans le forum Général Python
    Réponses: 6
    Dernier message: 11/04/2014, 16h53
  2. Réponses: 84
    Dernier message: 04/09/2009, 09h07
  3. aide pour lecture dans un fichier
    Par hichamo dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 10h46

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