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

PyQt Python Discussion :

Suivi de la progression lors de l'extraction d'un ZIP et mise en lignne


Sujet :

PyQt Python

  1. #21
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    "file", c'est le nom du fichier qui doit être créé sur le serveur ftp par l'upload

    A noter que si tu veux transférer non par un seul fichier mais une arborescence (un répertoire et son contenu), il faudra créer la fonction (probablement récursive) en utilisant les fonctions de création de répertoire et de changement de répertoire courant.

    D'après la doc, QFtp s'exécute de façon "asynchrone", c'est à dire sans bloquer le graphique. De ce fait, il ne devrait pas être nécessaire de le mettre dans un thread.

    A priori, quand on utilise put, l'avancement de l'upload (pour un seul fichier!) est donné par le signal dataTransferProgress(). Mais il faudra adapter pour que ce soit l'avancement de l'upload du répertoire et de son contenu (si j'ai bien compris).

    Je ne pourrai pas t'aider plus sur le sujet: je n'utilise pas QFtp mais seulement ftplib.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  2. #22
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    J'ai regardé du côté de ftplib, j'ai trouvé pour faire un appel récursif . Je vais voir pour m'occuper du thread mais normalement j'ai toute les cartes en main :p. Juste pour info, je suppose que vu que ce n'est pas une lib pour du GUI à la base, il n'y a pas de callback dispo dans la méthode storbinary pour suivre l'avancement de progression ?

  3. #23
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Rtransat Voir le message
    il n'y a pas de callback dispo dans la méthode storbinary pour suivre l'avancement de progression ?
    Le callback de FTP.storbinary existe depuis la version 2.6 de Python.

    Mais rappelle-toi que si tu "uploades" une arborescence complète comportant de nombreux fichiers, ce n'est pas forcément l'avancement de chacun des fichiers qui t'intéresse, mais l'avancement de l'upload complet en % ==> nb_de_fichiers_transférés / nb_total_de_fichiers_à_transférer * 100. Auquel cas le callback de storbinary ne servira pas. A moins d'afficher les 2 progressions en même temps comme certains logiciels le font.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #24
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Je suis de retour avec QFtp, je tente d'afficher la QProgressDialog en définissant dans l'event :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    self.ftp.dataTransferProgress.connect(self.upload_progression)
     
    def upload_progression(self, done, tot):
            self.progress_dialog.setValue((done * 100) / tot)
            self.progress_dialog.show()
            print("Chargement : %s sur %s" % (done, tot))
    Donc pour le coup, j'ai un avancement par fichier et non global (mais pour l'instant c'est pas encore très grave), le truc c'est que ça passe de 0 à 100, je ne vois pas la progression, et même chose dans le print, on passe de 0 à la taille du fichier.

  5. #25
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Quand un affichage ne "suit" pas le déroulement, il faut regarder dans 2 directions:

    1- peut-être que les opérations sont tellement rapides ou consomment tellement de ressources que l'affichage n'a pas le temps de se faire. Auquel cas, il y a une instruction pour "forcer" l'affichage en temps réel: "QtCore.QCoreApplication.processEvents()" (c'est dans le code que je t'ai déjà donné).

    2- quand il y a un avancement pour une opération, celle-ci se déroule forcément en plusieurs fois: pour les transfert ftp, c'est en blocs que ça se passe (par exemple: 8192 octets). Mais si on prend un fichier trop petit, l'avancement passera effectivement trop vite de 0% à 100%. Seulement, on ne dit pas dans la doc de QFtp quelle taille de bloc ils prennent... C'est bien dommage.

    Ce que je te propose: en plus de simplement afficher, ajoute les arguments d'appel à upload_progression dans une liste (initialisée dans l'__init__) et affiche-là à la fin! tu saura si c'est un affichage trop lent ou un fichier trop petit par rapport au bloc ftp!

    (donne le résultat, mais je n'aurai plus le temps de t'aider maintenant)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #26
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Je pense que c'est un avancement trop lent, la plupart de mes fichiers sont en Ko.

    J'ai mis ça dans un dictionnaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {'tot': 309590, 'done': 309590}
    {'tot': 415309, 'done': 415309}
    Si j'essaye avec ftplib, ça sera le même problème ? Il faut utiliser processEvents dans tout les cas pour être sûr ?

    PS : Je viens d'essayer avec ftplib, j'arrive à le mettre dans un thread . Pour l'avancement j'ai repris ton exemple du zip

    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
     
    import ftplib
    import os
    from PySide import QtCore
     
    class FtpException(Exception):
        pass
     
    class FtpThread(QtCore.QThread):
     
        prog_thread = QtCore.Signal(float)
        fin_thread = QtCore.Signal(str)
     
        def __init__(self, output, path_to_upload, parent=None):
            QtCore.QThread.__init__(self, parent)
     
            self.output = output
            self.path_to_upload = path_to_upload
     
            self.ftp = None
     
            self.stopthread = False
     
        def run(self):
            try:
                self.ftp = ftplib.FTP("ftp.xxx.fr", "xxx.fr", "xxx")
                self.ftp.mkd(self.output)
                self.ftp.cwd(self.output)
                self.upload(self.path_to_upload)
                self.ftp.close()
            except FtpException:
                pass
     
        def avancement(self, pourc):
            if self.stopthread:
                raise FtpException
            else:
                self.prog_thread.emit(pourc)
     
        def stop(self):
            self.stopthread = False
     
        def upload(self, path):
            files = os.listdir(path)
            os.chdir(path)
            for f in files:
                if os.path.isfile(path + r'\{}'.format(f)):
                    fh = open(f, 'rb')
                    self.ftp.storbinary('STOR %s' % f, fh, blocksize=8192, callback=self.avancement)
                    fh.close()
                elif os.path.isdir(path + r'\{}'.format(f)):
                    self.ftp.mkd(f)
                    self.ftp.cwd(f)
                    self.upload(path + r'\{}'.format(f))
            self.ftp.cwd('..')
            os.chdir('..')
    Et dans ma fenêtre principale j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def ftp_progression(self, pourc):
            print(pourc)
            self.progress_dialog_upload.setValue(pourc * 100)
     
            QtCore.QCoreApplication.processEvents()
    Pour le coup pourc vaut tout le temps 0.0


    EDIT : J'ai regardé un topic récent ou quelqu'un voulait le pourcentage aussi. Et tu lui a répondu : http://www.developpez.net/forums/d14...e/#post8011872

    J'ai donc adapté pour avoir self.totalSize = à la taille de mon répertoire uploadé. Il faut juste que je refactor, car pour le coup c'est bien le bordel :/. Et il faut que je vérifie que la totalité des fichiers sont uploadés au cas ou. Après si tu as une meilleure méthode depuis ce topic, je suis preneur aussi .

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Problème lors de l'extraction d'une sous-chaîne
    Par keul85 dans le forum Débuter
    Réponses: 4
    Dernier message: 31/01/2008, 20h58
  2. Problème de colonne lors de l'extraction en PDF
    Par fantagaro dans le forum Cognos
    Réponses: 6
    Dernier message: 25/10/2007, 09h47
  3. Réponses: 6
    Dernier message: 29/05/2007, 17h41
  4. Afficher les colonnes lors d'une extraction oracle
    Par griese dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 08/12/2006, 16h20
  5. [ADO] Progression lors d'un traitement
    Par portu dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2004, 10h06

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