Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avis sur quelques scripts

Sujet résolu
Anonyme
    3 avril 2011 à 15:23:43

    Bonjour,

    Je débute en python et j'ai écris quelques scripts pour générer de façon automatique des archives au format tar.gz, et un autre pour générer, à partir d'un fichier descriptif, des sommes de contrôle MD5, et j'aimerais savoir ce qu'en pensent des "pros" de python, ou du moins des personnes qui touchent leur bille dans ce langage (inutile d'être modeste).

    Il ne s'agit pas tant de regarder comment ça fonctionne, mais plutôt s'il n'y a pas des moyens plus rapide, ou plus "pythoniques" de faire certaines choses.

    Si vous voulez bien m'accorder de votre temps, j'en serais ravi :)

    Voici les scripts:

    Génération de sommes de contrôle MD5
    Le fichier descripteur qui va avec: http://pastebin.com/ZnYMbR8K

    Pour faire les archives:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import os
    import tarfile
    
    def reset_tarinfo(tarinfo):
    	tarinfo.uid = tarinfo.gid = 0
    	tarinfo.uname = tarinfo.gname = "root"
    	return tarinfo
    
    if __name__ == "__main__":
    	i = 0
    	list_tar = ['Global', 'Global', 'Les-Jeux-Indemodables_src', 'src', 'Windows.exe', 'exe-win', 'Linux-bin', 'exe-linux']
    	version = raw_input('Version number : ')
    	while i < len(list_tar):
    		tar = tarfile.open(list_tar[i] + "_"  + version + ".tgz", "w:gz")
    		tar.add(list_tar[i + 1])
    		for tarinfo in tar:
    			reset_tarinfo(tarinfo)
    		tar.close()
    		i += 2
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 avril 2011 à 18:27:49

      Pourquoi pas une boucle for plutôt qu'une boucle while

      import tarfile
      tar = tarfile.open("tonfichier.tar.gz", "w:gz")
      for name in ["fichier1", "fichier2"]:
          tar.add(name)
      tar.close()
      


      Il faudra peut-être rajouter une exception en cas d'impossibilité de créer ton archive, ou si la compression se passe mal

      Citation : doc officielle

      exception tarfile.CompressionError¶
      Is raised when a compression method is not supported or when the data cannot be decoded properly.



      Sinon, ben il y a pas grand chose à contrôler, donc on peut guère dire plus.

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        3 avril 2011 à 18:41:06

        Ah oui alors ce while c'est parce que ça va de deux en deux. Je lis le nom de l'archive à créer, et ensuite le dossier qu'on doit compresser.

        Aucun autre commentaire à propos de l'autre script ?
        • Partager sur Facebook
        • Partager sur Twitter
          3 avril 2011 à 19:01:12

          Juste un petit truc, mettre 4 espaces à la place de tes tabs.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            3 avril 2011 à 19:04:17

            Oui, entre temps je m'en suis aperçu ;)
            • Partager sur Facebook
            • Partager sur Twitter
              3 avril 2011 à 19:33:46

              Bonjour,

              def write_version_lst(n_f_list, n_f_version):
              	#...
              
              	for line in iter(lambda: file_list.readline(), ''):
              
              	    if line[0] == '$':
                              pass
              
              	    elif line != '':
                                  pass
              


              hm je ne comprends pas pourquoi iter(lambda: file_list.readline(), ''), une raison particulière ? pourquoi readlines() ne suffit pas ? (ou plus simplement for line in file_list).

              Admettons qu'il y ait une raison que je n'ai pas vu. Lambda me semble de trop : file_list.readline est déjà callable, ici c'est une méthode liée, donc for line in iter(file_list.readline, '') devrait suffir.

              Autre chose, vu que la boucle se termine à la première chaine vide renvoyer par readline, le elif line != '' me semble inutile (d'ailleurs si il avait une utilité, il faudrait le placer en tout premier (avant if line[0] == '$').

              except: c'est mal, except: IOError c'est mieux (ça évite de récupérer des KeyboardInterrupt ou autre).
              Un peu dans le même genre, on écrit plus les erreurs dans stderr que dans stdout.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                3 avril 2011 à 19:43:27

                for line in iter(file_list.readline(), ''):
                TypeError: iter(v, w): v must be callable


                Visiblement non, readline n'est pas callable.

                Pour le reste, j'en prend bonne note, merci :)

                Edit: effectivement, le elif line != '': est bel est bien inutile.
                • Partager sur Facebook
                • Partager sur Twitter
                  3 avril 2011 à 19:46:45

                  Citation : akregator

                  for line in iter(file_list.readline(), ''):
                  TypeError: iter(v, w): v must be callable



                  Visiblement non, readline n'est pas callable.



                  Attention, c'est bien file_list.readline qu'il faut envoyer, et non le résultat fournit par son appel, donc sans les parenthèses à la fin ;)

                  for line in iter(file_list.readline, ''):
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    3 avril 2011 à 19:48:12

                    Hum. Pourrais-tu m'expliquer la différence s'il-te-plaît ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 avril 2011 à 19:54:05

                      La différence c'est que d'un côté en écrivant readline() tu envoies le résultat de l'appel à la méthode readline, qui n'est pas "callable" puisque c'est une chaine de caractères, alors qu'en écrivant readline, tu envoies la méthode en elle-même à une autre fonction, en considérant que c'est un simple objet (qui lui est "callable", puisque c'est une méthode...).
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                      Anonyme
                        3 avril 2011 à 19:55:38

                        D'accord !

                        Merci pour ces conseils ;)

                        Si vous avez d'autres remarques, astuces ou que sais-je, je suis preneur.
                        Par ailleurs, si vous voulez suivre les modifications, voici un lien pratique:

                        archives.py et version.lst.py sur google code.

                        PS: ne croyez pas que je fais de la pub pour ce projet, que je n'ai d'ailleurs pas initié.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          3 avril 2011 à 20:26:56

                          Citation

                          Ah oui alors ce while c'est parce que ça va de deux en deux. Je lis le nom de l'archive à créer, et ensuite le dossier qu'on doit compresser.



                          Je ne sais pas si j'ai bien compris ce que tu veux mais pourquoi tu n'utilises pas les dicos?

                          dict = {'Les-Jeux-Indemodables_src':'src'}
                          


                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            3 avril 2011 à 20:28:22

                            Maintenant j'utilise ceci:

                            list_tar =  [#name, folder/file, summary, labels
                                            ['Global', 'Global', 'Ressources : sons, niveaux, etc...', ''],
                                            ['Les-Jeux-Indemodables_src','src','Les sources du jeu.', ''],
                                            ['Windows.exe','exe-win', 'Exécutable Windows', ''],
                                            ['Linux-bin', 'exe-linux', 'Exécutables Linux i386 et x86_64', '']
                                            ]
                            


                            Je ne sais pas si un dictionnaire serait plus approprié.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              3 avril 2011 à 20:30:19

                              Citation

                              Je ne sais pas si un dictionnaire serait plus approprié.



                              Moi je trouve que si, mais bon c'est une question de point de vue, et surtout si tu te sens à l'aise avec.

                              >>> dico = {"archive_1":"dossier1", "archive_2":"dossier2", "archive_3":"dossier3"}
                              >>> for archive in dico.keys():
                              ...     print archive
                              ... 
                              archive_2
                              archive_3
                              archive_1
                              >>> for dossier in dico.values():
                              ...     print dossier
                              ... 
                              dossier2
                              dossier3
                              dossier1
                              >>> for archive, dossier in dico.items():
                              ...     print archive, dossier
                              ... 
                              archive_2 dossier2
                              archive_3 dossier3
                              archive_1 dossier1
                              >>> dico["archive_1"]
                              'dossier1'
                              


                              Quand même plus simple à gérer non?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                3 avril 2011 à 20:38:46

                                Moui. J'ai regardé ce que ça peut faire, mais comme tout sera enregistré à un index fixe, c'est plus simple à mon avis.

                                En effet, ton exemple est très explicite ! Je vais voir, merci ;)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Avis sur quelques scripts

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown