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 :

Récupérer un chemin à partir d'un FD


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Récupérer un chemin à partir d'un FD
    Bonjour à tous,

    Je bloque en ce moment sur un problème assez ennuyeux. Je travail sur un projet auquel je suis en train d'ajouter un module. Le problème étant qu'un fichier est ouvert plus haut dans le code, mais au niveau du module je n'ai pas accès au chemin absolu du fichier, seulement au file descriptor.

    Après avoir farfouiller la bibliothèque os.* je n'ai rien trouvé d'intéressant qui puisse me permettre de récupérer ce chemin à partir du FD.

    Peut-être pourrait-on m'éclairer à ce sujet ?

  2. #2
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    si tu as ouvert ton fichier avec la fonction open, par exemple
    tu peux accéder à la chaine filename par la méthode fd.name.
    Par contre, fd.name te renverra exactement le contenu de filename (donc un chemin relatif si filename l'était).
    Si tu veux obtenir un chemin absolu, tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.path.abspath(fd.name)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse.

    En fait le fichier a été ouvert en C++, donc le FD n'est qu'un int et non pas un objet.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Points : 143
    Points
    143
    Par défaut
    Ok, désolé, je n'avais pas bien compris ton problème.
    Dans ce cas, je ne vois pas de solution portable.

    Une manière qui ne marche que sur les systèmes Unix/Linux est d'appeler la commande lsof.

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsof -a -d monfd -p monpid
    te renverra des informations sur le fichier dont le fd est monfd et le pid est monpid (notamment le chemin absolu du fichier).
    Pour connaitre le pid du programme en cours, tu peux utiliser la fonction
    os.getpid()

    Voici un exemple de code (à améliorer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import subprocess
    import os
     
    def getFullPathFromFd(fd):
        pid = os.getpid()
        cmd = ['lsof', '-a', '-p', str(pid), '-d', str(fd)]
        output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
        lines = output.split('\n')
        if len(lines) == 1:
            pass # aucun fichier n'a ce fd, gerer l'erreur
        else:
            return lines[1].split()[8]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 439
    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 439
    Points : 37 030
    Points
    37 030
    Par défaut
    Citation Envoyé par Ugo83 Voir le message
    Après avoir farfouiller la bibliothèque os.* je n'ai rien trouvé d'intéressant qui puisse me permettre de récupérer ce chemin à partir du FD.
    A un fd correspondent des inodes et un chemin avec des noms de disques qui n'ont rien avoir avec le nom du fichier utilisé au départ.
    => si vous voulez récupérer ce nom là, peut être en essayant de restreindre les filesystems utilisables ?

    A part récupérer le nom du fichier, vous pouvez déjà faire toutes les opérations que vous voulez sur le fichier 'ouvert'.

    Que va vous apporter d'avoir en plus le nom?

    - W

  6. #6
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Sujet qui me dépasse mais bon :

    Il ne me semble pas que cela soit le nom mais le chemin absolu la question.
    Puisque le fichier est ouvert en C++ pourquoi ne pas donner aussi cette information 'plus haut' ?

    @+

  7. #7
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2010
    Messages : 99
    Points : 143
    Points
    143
    Par défaut
    Je suis d'accord avec les deux commentaires précédents.
    Rechercher le nom d'un fichier à partir d'un fd n'est pas quelque chose de naturel puisque, si tu as ouvert un fichier, c'est qu'à un moment donné tu connaissais son nom.
    Le mieux, je pense, est de reprendre le code en amont et de stocker le chemin du fichier quelque part au moment où tu l'ouvres.
    Il peut y avoir différentes manières mais je ne peux pas en dire plus sans avoir vu à quoi ressemblait le code.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Effectivement il serait plus simple de stocker cette information plus haut. L'ennui étant que la partie du noyau C++ ne me concerne pas. Je vais essayer d'en parler aux gens qui y travaillent, je pense que ça doit être la solution la plus simple.

    Merci à tous.

    EDIT : Merci Biribibi, mais l'application est portable Windows/Linux. Sinon je sais que ça n'a pas l'air naturel de faire ce genre d'opération, mais le fait est que je travail avec des fichiers qui sont sur un VFS et exploitables uniquement via les fonctions C++ du framework (noyau). C'est plutôt contraignant.

Discussions similaires

  1. Récupérer vrai chemin à partir d'un subst
    Par kururin dans le forum Windows 7
    Réponses: 0
    Dernier message: 29/11/2010, 12h20
  2. Réponses: 24
    Dernier message: 29/03/2010, 11h12
  3. Récupérer le chemin d'un fichier xls créé à partir d'un XLT en VBA
    Par alunama dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/07/2008, 14h51
  4. Récupérer le chemin de l'alias a partir du database
    Par rippoz dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/08/2004, 15h59
  5. Récupérer le chemin d'accés du PFile.
    Par Laurent Dardenne dans le forum Administration
    Réponses: 7
    Dernier message: 03/02/2004, 18h21

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