[python] wip synchroniser des répertoires (newb)

wip synchroniser des répertoires (newb) [python] - Python - Programmation

Marsh Posté le 27-04-2004 à 12:52:59    

Bonjour,
suite à la fin de ma lecture du tuto python, j'essaie de m'y mettre  [:banzai] (c'est pas gagné).
Comme 1er prog j'ai pensé à un synchroniseur de dossiers (fonctionalités très simples au début en ligne de commande interface graphique par la suite).
Après avoir bataillé quelque temps avec la doc pyton j'en suis là (c'est vraiment le début) :


from sys import *
from os import *
from filecmp import *
 
def verif():
    if len(argv)<=3:
        exit("Utilisation : ce programme necessite au moins 3\
        arguments : le repertoire source, le repertoire cible et le\
        mode de synchronisation (ex force pour copier l'integalite\
        des fichiers de sources vers cible)" )
 
def force(source, cible):
 
    list=dircmp(source,cible)
    list.report()
    for i in list.left_list:
        print i
        #copier les fichiers de source vers cible    
 
# Debut prog principal
 
verif()  #verif nbre parametres
 
#verification de l'existence des repertoires
 
if access(argv[1],F_OK)==0:
    print "Le dossier source n'existe pas, verifier et recommencer"
 
if access(argv[2],F_OK)==0:
    while 1:
        rep=raw_input("Le dossier cible n'existe pas, voulez vous le creer o/n ?" )
        if rep=="n":
            exit("Abandon utilisateur" )
        if rep=="o":
            mkdir(argv[2])
            break
     
if argv[3]=="force":
    force(argv[1],argv[2])


 
à première vue je vous semble pas trop mal parti ?  
 
ma question est de savoir si il existe un module pour copier des fichiers d'un repertoire vers un autre ou faut il appeler une commande système ?
pis si vous avez des conseils...
Merci.


Message édité par kayasax le 27-04-2004 à 15:17:37
Reply

Marsh Posté le 27-04-2004 à 12:52:59   

Reply

Marsh Posté le 27-04-2004 à 13:14:18    

pour les parametres, au lieu des argv :  
http://docs.python.org/lib/module-getopt.html
 
pour les fichiers :
http://docs.python.org/lib/module-shutil.html

Reply

Marsh Posté le 27-04-2004 à 14:10:05    

merci !

Reply

Marsh Posté le 27-04-2004 à 14:41:42    

Tu ferais bien d'orienter ton programme en poo, python est fait pour ça.
 
Tu n'utilises pas les exceptions. Si jamais une erreur inattendue surgie, ton prog va se planter sans indiquer de cause. Chaque appel système par exemple doit être protégé pour t'indiquer un problème éventuel.

Reply

Marsh Posté le 27-04-2004 à 15:15:27    

chaica a écrit :

Tu ferais bien d'orienter ton programme en poo, python est fait pour ça.
 
Tu n'utilises pas les exceptions. Si jamais une erreur inattendue surgie, ton prog va se planter sans indiquer de cause. Chaque appel système par exemple doit être protégé pour t'indiquer un problème éventuel.


j'ai encore beaucoup de mal avec les objets moi ! pour l'instant je ne vois pas l'interet de passer en objet (que mettre dedans à part un path ??)
à quel niveau tu me suggeres d'utiliser les exceptions ? genre ca ?
try :
    access(argv[1],F_OK)
except :
    print 'erreur'
 
 
C'est moi ou la doc de python est super mal foutue ?? la je cherche une fonction pour convertir des chemins windows en chemin unix mais ... trouve pas !  :??:  
 
 :hello:  
 

Reply

Marsh Posté le 27-04-2004 à 15:21:20    

kayasax a écrit :


C'est moi ou la doc de python est super mal foutue ?? la je cherche une fonction pour convertir des chemins windows en chemin unix mais ... trouve pas !  :??:  


je serais tenté de dire que c'est toi  [:sinclaire]  
http://docs.python.org/lib/module-os.path.html

Reply

Marsh Posté le 27-04-2004 à 15:24:49    

Citation :

C'est moi ou la doc de python est super mal foutue ?? la je cherche une fonction pour convertir des chemins windows en chemin unix mais ... trouve pas !  :??:  


 
Ca vient de toi en effet.
 
Cas typique de l'utilisation d'une exception:

Code :
  1. try:
  2.     mkdir(argv[2])
  3. except OSError, msg:
  4.     print msg


 
Quant à l'objet, ton programme étant à but didactique, tu ferais bien d'y passer.
Enfin importer brutalement comme tu fais tous les composants d'un module, ça peut être risqué.

Reply

Marsh Posté le 27-04-2004 à 15:34:40    

j'ai remplacé l'importation des modules :


from sys import argv,exit
from os import path,access
from filecmp import dircmp
from shutil import copy


 
mais du coup ca merdouille je comprends pas pourquoi :

 File "E:\Mes scripts python\paraaetre.py", line 27, in ?
    if access(argv[1],F_OK)==0:
NameError: name 'F_OK' is not defined


 
 
j'avais bien trouvé la page sur le module os.path
mais justement il est marqué que pas mal de fonctions ne fonctionnent pas bien sous windows, que splitunc() et ismount() eux fonctionnent mais sans plus d'explication ...
 
exemple :

>>> listdir('c:\temp')
 
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in -toplevel-
    listdir('c:\temp')
WindowsError: [Errno 123] Syntaxe du nom de fichier, de répertoire ou de volume incorrecte: 'c:\temp/*.*'
listir('c:/temp') fonctionne bien lui ...
 
si j'essaie de normaliser le path :
>>> print os.path.normpath('c:\temp')
c: emp
>>>  
-> \t est converti en tabulation  
 


 
Ok pour les exceptions (habitude à prendre je suppose)
 
Pour en revenir à l'objet, il faut que je considère l'ensemble de mon appli comme étant une instance d'une classe c'est bien ça ?
 
Encore merci et désolé pour mes questions à la con...


Message édité par kayasax le 27-04-2004 à 15:59:18
Reply

Marsh Posté le 27-04-2004 à 16:24:30    

Normal F_OK est une constante du module os donc os.F_OK  pour l'utiliser.
 
Y'a pas de questions cons.
 
En gros pou la poo ta classe doit incarner ce que va faire ton programme.
 
ex:

Code :
  1. # le nom de ta classe
  2. class HelloWorld:
  3.    # le constructeur qui est appele quand tu instancies l objet.
  4.    # c est la premiere action realise par ton objet.
  5.    def __init__(self):
  6.       print 'hello '
  7.       self.afficherWorld()
  8.    #une methode interne. On l'appelle avec le prefixe self.
  9.    def afficherWorld(self):
  10.       print 'World!'
  11. if __name__ == '__main__' :
  12. #tu est dans le main, tu vas utiliser l objet defini plus haut.
  13. hw = HelloWorld()


Message édité par chaica le 27-04-2004 à 16:30:40
Reply

Marsh Posté le 27-04-2004 à 16:37:58    

merci, bon c'est pas encore gagné, je crois que je vais me payer le python cookbook pour avoir plus d'exemples .

Reply

Marsh Posté le 27-04-2004 à 16:37:58   

Reply

Marsh Posté le 27-04-2004 à 20:51:06    

Reply

Marsh Posté le 27-04-2004 à 21:23:33    

Reply

Marsh Posté le 28-04-2004 à 10:19:27    

Savez vous comment on peut avoir les caractères accentués dans les scripts python dans une console DOS ?
Merci.

Reply

Marsh Posté le 28-04-2004 à 11:57:03    

kayasax a écrit :

dans les scripts python dans une console DOS ?


:??: c'est pas clair ta question...
je pense que ton problème vient du fait que la console windows n'affiche pas les caractères ANSI mais DOS. pour l'ascii, c'est la même chose, mais pas pour les lettres accentuées. Il faut donc lui donner directement le code DOS des caractères.

Reply

Marsh Posté le 29-04-2004 à 15:12:43    

Excellent python cookbook, j'ai trouvé le prog pyrobocopy que je suis en train de modifier : j'ai ajouté le support de liste de destinations , maintenant je vais essayé de m'attaquer à la connexion automatisée de lecteur réseau.
Ce qui me fait m'interroger : y a t'il une fonction interne python sous windows pour crypter/decrypter un fichier ??
 
Encore merci, a+

Reply

Marsh Posté le 29-04-2004 à 15:15:34    

Reply

Marsh Posté le 29-04-2004 à 15:21:59    

merci lorill

Reply

Marsh Posté le 29-04-2004 à 15:29:05    

g un sousci lorsque je veux installer le module de crypto :
 
error: Python was built with version 6 of Visual Studio, and extensions need to
be built with the same version of the compiler, but it isn't installed.
 
il y a une dll à catcher ou qqchose dans le genre ?  

Reply

Marsh Posté le 03-05-2004 à 11:02:58    

up j'ai jamais eu vs6 d'installer sur mon poste ! ??
 
edit :
ah bah même si il y a le msg d'erreur le module s'est bien installé !


Message édité par kayasax le 03-05-2004 à 11:21:22
Reply

Marsh Posté le 03-05-2004 à 15:07:36    

j'aurais besoin d'un complément d'infos pour filecmp.dircmp() :
est il possible de récupérer que les différences avec la fonction report_full_closure() ?
=>  
self.listecomparaison=filecmp.dircmp(self.source,self.cible)
print "détails : ", self.listecomparaison.report_full_closure()
donne :
Identical files : ['CIBLE.NAF', 'DATA_001.NSF', 'MPEG-2.EXE', 'Mpeg2Decoder.ax
 'Mpeg2Parser.ax', 'axter.bat', 'tititi.txt']
Differing files : ['test.txt']
Common subdirectories : ['sr1']
diff c:\test\sr1 c:\test2\sr1
Identical files : ['eee.doc']
 
 
--> j'aimerai qu'il me récupère juste la liste des 'differing files' et j'aimerai savoir sur quoi le module se base pour trouver les différences (tailles des fichiers , date de modif ou de creation, attributs ...???)
 
enfin si quelqu'un sait quels attributs on peut récupérer avec __getattr__() : "Note that via __getattr__() hooks, all attributes are computed lazilly, so there is no speed penalty if only those attributes which are lightweight to compute are used. "
 
Merci

Reply

Marsh Posté le 03-05-2004 à 15:57:50    

je repond à 1 de mes questions :
dircmp se base sur le module cmpcache :
# Module 'cmpcache'
#
# Efficiently compare files, boolean outcome only (equal / not equal).
#
# Tricks (used in this order):
#       - Use the statcache module to avoid statting files more than once
#       - Files with identical type, size & mtime are assumed to be clones
#       - Files with different type or size cannot be identical
#       - We keep a cache of outcomes of earlier comparisons
#       - We don't fork a process to run 'cmp' but read the files ourselves

Reply

Marsh Posté le 10-05-2004 à 13:00:14    

:bounce: personne pour m'aider  :heink: :

est il possible de récupérer que les différences avec la fonction report_full_closure() ?  
=>  
self.listecomparaison=filecmp.dircmp(self.source,self.cible)  
print "détails : ", self.listecomparaison.report_full_closure()  
donne :  
Identical files : ['CIBLE.NAF', 'DATA_001.NSF', 'MPEG-2.EXE', 'Mpeg2Decoder.ax  
'Mpeg2Parser.ax', 'axter.bat', 'tititi.txt']  
Differing files : ['test.txt']  
Common subdirectories : ['sr1']  
diff c:\test\sr1 c:\test2\sr1  
Identical files : ['eee.doc']  
 
 
--> j'aimerai qu'il me récupère juste la liste des 'differing files'  
Merci  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed