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 :

Faire fonctionner son code chez l'utilisateur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 40
    Par défaut Faire fonctionner son code chez l'utilisateur
    Bonjour,

    Comment faire pour qu'un code fonctionne correctement chez l'utilisateur ? C'est à dire ne pas avoir à le modifier, j'explique le problème.

    J'avais fait le tp Roboc d'open classroom, j'avais spécifié en répertoire de travail courant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
     
    os.chdir("C:/Python/Tp-du-labyrinthe/Labyrinthe/Roboc")
    Chez moi le code fonctionnait à merveille, mais chez les utilisateurs de mon programme ce n'était pas le cas puisqu'ils n'étaient pas sur le même répertoire de travail courant que moi.

    Le problème c'est que j'ai aussi téléchargé la correction du tp et c'est exactement la même chose que moi, le code ne fonctionnait pas chez moi j'ai du le faire fonctionner en mettant mon propre répertoire de travail courant.

    J'ai aussi corrigé trois élèves différents et sur les trois élèves j'ai aussi du modifier le répertoire pour que le code fonctionne.

    Dans la correction entre pair on a un critère qui dit que si le code fonctionne comme attendu on met 1 point sinon 0.

    Moi j'ai toujours mis 1 point même si je devais juste modifier le répertoire de travail courant car ça m'avait l'air naturelle puisque tout le monde avait fait "l'erreur".

    Sauf que les mecs qui m'ont corrigés m'ont toujours dit qu'il fallait utiliser un chemin relatif pour que le code fonctionne chez tout le monde sans avoir à modifier quoi que ce soit. Mais je pose la question, est ce réellement possible de faire ça ?

    J'ai enlevé la fonction os.chdir et je constate que mon programme plante alors sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for nom_fichier in os.listdir("cartes"):
     
        print(nom_fichier)
     
    FileNotFoundError: [WinError 3] Le chemin d'accès spécifié est introuvable: 'cartes'
    Je pourrais utiliser un chemin absolu mais ça ne fonctionnera alors que chez moi et non chez les utilisateurs.

    Comment faire pour que ça fonctionne chez tout le monde de la même manière sans que les gens soient obligés de modifier mon code ???

    Je constate que le code suivant fonctionne parfaitement :

    C'est bien la preuve que le dossier cartes contenu dans le même dossier que mon fichier que j'exécute est bien trouvé.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Tu peux faire mettre cette ligne ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.chdir(os.path.dirname(os.path.realpath(__file__)))
    Comme ca le code s'éxécutera toujours dans le répertoire dans lequel se situe le fichier de code lui-même.
    Et ensuite oui tu peux mettre des chemins relatifs.

    Si le répertoires "cartes" est un cran au dessus, tu dois utilser ".." pour remonter d'autant de cran qu'il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "../cartes"    ### -> remonte d'1 cran
    "../../cartes" ### -> remonte de 2 crans

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2018
    Messages : 40
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Tu peux faire mettre cette ligne ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.chdir(os.path.dirname(os.path.realpath(__file__)))
    Comme ca le code s'éxécutera toujours dans le répertoire dans lequel se situe le fichier de code lui-même.
    Et ensuite oui tu peux mettre des chemins relatifs.

    Si le répertoires "cartes" est un cran au dessus, tu dois utilser ".." pour remonter d'autant de cran qu'il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "../cartes"    ### -> remonte d'1 cran
    "../../cartes" ### -> remonte de 2 crans

    Merci d'avoir pris le temps de me répondre.

    ça fonctionne parfaitement.

    En ce qui concerne os.path.realpath il est dit que cette fonction enlève les liens symboliques rencontré dans le chemin, que veut dire la documentation par là ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Les liens symboliques se sont les raccourcis (qui se matérialisent d'ailleurs par une icone contenant une petit flèche dans le coin dans votre explorateur de fichier). A priori dans un code il n'y en a pas (je vois peu l'intérêt, faire ceci serait plus une source d'erreur qu'autre chose selon moi, bien que je suis sûr que qqn sur ce forum pourrait trouver un cas dans lequel c'est utile, mais bref).

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Akainu_2018 Voir le message
    En ce qui concerne os.path.realpath il est dit que cette fonction enlève les liens symboliques rencontré dans le chemin, que veut dire la documentation par là ?
    à l'origine les liens symboliques appartiennent au monde Unix/Linux, les versions récentes de Windows permettent désormais de faire des liens symboliques via la commande mklink mais il faut des droits admin pour les créer, ensuite comme dit lg_53 ce sont des sortes de raccourcis (mais rien à voir avec les raccourcis Windows en revanche !), un lien symbolique "pointe" vers un répertoire ou un fichier qui se trouve ailleurs dans l'arborescence et le référence dans le répertoire qu'on veut

    si on prend une arborescence fictive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /
    |-- rep1
    |   `-- monfichier
    `-- rep2
        `-- rep3
            `-- monfichier -> ../../rep1/monfichier
    on a le fichier /rep2/rep3/monfichier qui est en fait un lien symbolique de /rep1/monfichier, ce n'est pas une copie, c'est le même fichier qui est disponible à deux endroits différents, si on modifie le fichier depuis l'un ou l'autre des répertoires c'est le même fichier qui est modifié dans les deux cas

    os.path.realpath() n'"élimine" pas les liens symboliques comme c'est marqué dans la doc mais les "déréférence", c'est à dire qu'il effectue la résolution de ces liens symboliques pour retrouver le fichier d'origine
    et donc concrètement os.path.realpath('/rep2/rep3/monfichier') va renvoyer '/rep1/monfichier' puisqu'il aura vu que le fichier est un lien symbolique

    en revanche sous Windows os.path.realpath() ne déréférence pas les liens symboliques créés par la commande mklink ( https://bugs.python.org/issue9949 )

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 15/06/2015, 15h48
  2. Réponses: 1
    Dernier message: 07/02/2012, 13h22
  3. Réponses: 6
    Dernier message: 18/08/2010, 09h13
  4. Réponses: 4
    Dernier message: 19/03/2009, 21h38
  5. [AJAX] Prérequis pour faire fonctionner ce code Ajax?
    Par Lex92 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/10/2008, 09h17

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