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 :

remplacer chemin absolu par chemin relatif


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut remplacer chemin absolu par chemin relatif
    Bonjour,

    J'aimerai savoir comment on peut remplacer des chemins absolus par des chemin relatifs.

    Par exemple ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def showDialog_msa1(self):
            self.filename_msa1 = QFileDialog.getOpenFileName(self, 'Open file', '/home/lahure/Documents')
            fname = open(self.filename_msa1)
            self.data_file_msa1 = fname.read()
            self.namefile_msa1.setText(self.filename_msa1)
    ou ici ;

    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
    def treatment(self):
            self.parserfile()
            tabID=[]
            tabseq=[]
            tablength=[]
            sequence=""
            i=0
            fich=open("/home/lahure/Documents/msadiff/files/"+self.file_read,"r")
            for line in fich:
                line=line.replace("\n","")
                line=line.replace(".","-")
                if re.match("^>",line):
                    id_len=line.split("/")
                    tabID.append(id_len[0])
                    tablength.append(id_len[1])
                    tabseq.append(sequence)
                    sequence=""
                else:
                    sequence=sequence+line
                    sequence=sequence.upper()
            tabseq.append(sequence)
            tabseq.remove("")
            length=len(tabseq)
            self.set_seq_object(tabID, tablength, tabseq, length)
    J'aimerai ne plus avoir de chemin absolu, mais je sais pas du tout comment faire.

    Alaninho

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tu peux peut être utiliser la commande :

    qui te permet d'avoir le chemin du fichier .py que tu exécute, à partir de ce chemin, à toi de compléter l'adresse.

    Ou, de mettre "/home/lahure/Documents" en variable de configuration, comme ça si ça change tu ne le change qu'une seule fois dans ton programme.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Je peux pas utiliser /home/lahure/documents car ensuite le programme sera sur un serveur et donc l'accès à mon compte sera privé.
    Tu peux me donner un exemple avec la commande os.getcwd() stp.

    Merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    avec os.path.relpath

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 751
    Points
    1 751
    Par défaut
    Bonjour.

    os.getcwd() va renvoyer le dossier d'où est lancé le script, et non où est le script.

    Personnellement, j'utilise : os.path.dirname( __file__ ).

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Merci, pourrai-je avoir un exemple avec os.getcwd(), car je comprend par en quoi elle remplace le chemin absolu.

  7. #7
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    alaniho, l’idée est bien de mettre “en dur” dans ton code un chemin relatif vers ton/tes fichiers ?

    Dans ce cas, il faut que tu récupères la racine courante de ce chemin relatif.

    os.getcwd() va te retourner le chemin absolu vers le dossier d’où a été lancé ton script (le dossier courant dans la console dans laquelle tu l’as lancé, par ex.)

    os.path.dirname(__file__) va te retourner le chemin absolu vers le dossiercontenant ton script (file étant une variable spéciale qui contient toujours le chemin absolu vers le fichier du script).

    À toi de voir quelle option (quelle racine) te conviendrait le mieux.

    Ensuite, une fois que tu as ta racine, tu la joint à ton chemin relatif pour obtenir le chemin définitif.

    Par exemple, en supposant que tes fichiers soient dans un dossier data, frère du dossier contenant ton script, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import os
    root = os.path.dirname(__file__)
    rel_path = os.path.join("..", "data")
     
    abs_path = os.path.join(root, rel_path)
     
    # Tu peux maintenant utiliser abs_path…
    PS : Utilise toujours os.path.join pour assembler les éléments de test chemins, comme ça python se charge de gérer les différents séparateurs selon l’OS courant (/ sous Unix, \ sous Windows, etc.).

  8. #8
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour,

    à mon avis, le problème que tu poses (comment remplacer des chemins absolus par des chemins relatifs) est ... un faux problème.

    Comme tu le dis toi-même :

    le programme sera sur un serveur et donc l'accès à mon compte sera privé
    Donc, voir figurer, en dur, dans ton code, des chemins faisant explicitement référence à la sous-arborescence liée à ton compte utilisateur est très vilain, que tu utilises des chemins absolus ou relatifs. Le passage chemins absolus -> chemins relatifs n'y changera strictement rien.

    Tu dois plutôt te poser la question de l'emplacement des fichiers que l'utilisateur aura à manipuler.

    Si ce sont des fichiers communs à plusieurs utilisateurs, il faudra les mettre à un endroit constant (pas fonction de l'utilisateur) dans l'arborescence standard (Unix/Linux vu les "/" et "/home") et, tant qu'à faire, pas trop idiot.

    S'ils sont propres à chaque utilisateur, il faut les mettre dans la sous-arborescence de l'utilisateur, soit à un endroit fixe soit à un endroit que peut fixer l'utilisateur (via une variable d'environnement par exemple, valeur que tu récupères via un os.getenv).

    Une fois que tu auras organisé tout ça sur le papier, la problèmatique des chemins absolus ou relatifs tombera d'elle même.

    scrogneugneu : os.getcwd ne donne pas le répertoire d'où on a lancé le script !!! Ca fournit le path absolu du répertoire courant ! Dans certains cas et sous certaines conditions seulement, ces deux chemins peuvent être les mêmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mac0908mt070:~ pascal$ more ou.py
    # -*- coding:utf-8 -*-
    import os
    os.chdir('/')
    print "aurais-je lancé mon script depuis %s ???" % os.getcwd()
    mac0908mt070:~ pascal$ pwd
    /Users/pascal
    mac0908mt070:~ pascal$ python ou.py
    aurais-je lancé mon script depuis / ???
    mac0908mt070:~ pascal$

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    c'est exactement ça plxpy, l'utilisateur utilsera ces propres fichiers venant soit de son disque dur soit d'un serveur, mais je vois pas comment cela est un faux problème. Peux tu m'expliquer d'avantage stp?

    merci

    Alaninho

  10. #10
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    C'est un faux problème parce que tu mets in extenso "/home/lahure/ ..." dans ton code.

    Tu ne peux pas espérer rendre ce code utilisable par tout le monde : tu dis toi même que ton espace sera privé. Donc, pourquoi ce "/home/lahure" dans le code ??? Ca aurait un sens si, systématiquement, les fichiers à utiliser par tous les utilisateurs se trouvaient sous /home/lahure (se poserait ensuite le problème des droits d'accès ...)

    Le fait que les chemins soient absolus ou relatifs n'a pas d'importance : si ils désignent quelque chose sous /home/lahure, c'est foutu.

    Dans ton premier exemple de code, ne mets pas dans les arguments un path lié à ton compte utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.filename_msa1 = QFileDialog.getOpenFileName(self, 'Open file', '/home/lahure/Documents')
    mais quelque chose de plus neutre (par exemple le répertoire de login de l'utilisateur)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.filename_msa1 = QFileDialog.getOpenFileName(self, 'Open file', os.getenv("HOME"))
    Je ne suis pas expert en IHM mais, généralement, cet argument correspond au répertoire dans lequel l'utilisateur se retrouve dans la fenêtre de sélection de fichiers. Libre ensuite à lui d'aller ailleurs.

    Et pour le deuxième bout, stocke "ce qui va bien" dans l'attribut file_read. On a l'impression que tu y mets un nom simple d'un fichier forcément placé sous /home/lahure/Documents/msadiff/files : d'après ce que tu dis, ça ne semble pas être le cas.

  11. #11
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Citation Envoyé par plxpy Voir le message
    scrogneugneu : os.getcwd ne donne pas le répertoire d'où on a lancé le script !!! Ca fournit le path absolu du répertoire courant ! Dans certains cas et sous certaines conditions seulement, ces deux chemins peuvent être les mêmes
    Oui, en effet… J’ai écrit trop vite…

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Points : 140
    Points
    140
    Par défaut
    Merci plxpy, c'est vrai c'est un faux problème.
    Tout exemple m'a bien aidé.

    Alaninho

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Transformé chemin absolu en chemin relatif?
    Par diki971 dans le forum Access
    Réponses: 1
    Dernier message: 04/06/2014, 13h35
  2. Changer un chemin absolue en chemin relatif
    Par Chillon dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/10/2010, 17h14
  3. charger feuille CSS par chemin absolu du système de fichiers
    Par luctheo dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 26/08/2008, 08h45
  4. Chemin absolue vers chemin relatif
    Par TheDrev dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 13/02/2008, 11h32
  5. chemin relatif vs chemin absolu
    Par maxos75 dans le forum ASP
    Réponses: 7
    Dernier message: 29/03/2006, 16h47

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