108 votes

PYTHONPATH vs sys.chemin

Un autre développeur et je suis en désaccord quant à savoir si PYTHONPATH ou sys.chemin d'accès doit être utilisé pour permettre à Python pour trouver un paquet Python à un utilisateur (par exemple, le développement d'un répertoire.

Nous avons un projet de Python à un type de structure de répertoire:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

Dans script.py nous devons import package.lib. Lorsque le package est installé dans site-packages, script.py trouverez package.lib.

Lorsque vous travaillez à partir d'un répertoire de l'utilisateur, cependant, quelque chose doit être fait. Ma solution est de mettre mon PYTHONPATH pour inclure "~/Projet". Un autre développeur veut mettre cette ligne de code au début de script.py:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

De sorte que Python peut trouver la copie locale de l' package.lib.

Je pense que c'est une mauvaise idée, tant que cette ligne n'est utile que pour les développeurs ou les personnes en cours d'exécution à partir d'une copie locale, mais je ne peux pas donner une bonne raison pourquoi c'est une mauvaise idée.

Devrions-nous utiliser PYTOHNPATH, sys.le chemin, ou une amende?

44voto

Ned Batchelder Points 128913

Si la seule raison pour modifier le chemin d'accès est pour les développeurs travaillent à partir de leur arbre de travail, alors vous devriez utiliser un outil d'installation pour configurer votre environnement pour vous. virtualenv est très populaire, et si vous utilisez setuptools, vous pouvez simplement exécuter setup.py develop semi-installation de l'arbre de travail dans votre installation de Python.

40voto

bobince Points 270740

Je déteste PYTHONPATH. Je le trouve fragile et ennuyeux à définir sur une base par utilisateur (en particulier pour les démon utilisateurs) et de suivre comme des dossiers de projet se déplacer. Je suis beaucoup plus ensemble sys.path dans l'invoquer des scripts pour gérer de façon autonome des projets.

Toutefois sys.path.append n'est pas la façon de le faire. Vous pouvez facilement obtenir des doublons, et il n'a pas trier .pth fichiers. Meilleur (et plus lisible): site.addsitedir.

Et script.py ne devraient normalement pas être le meilleur endroit pour le faire, comme c'est à l'intérieur du paquet que vous voulez mettre à disposition sur le chemin. Bibliothèque de modules doit certainement pas être en contact avec sys.path eux-mêmes. Au lieu de cela, normalement vous devriez avoir un hashbanged-script à l'extérieur du colis que vous utilisez pour instancier et exécuter l'application, et c'est dans cette petite script vous mettrais les détails de déploiement comme sys.path-frobbing.

13voto

sateesh Points 7967

En général, je considère la mise en place d'une variable d'environnement (comme le PYTHONPATH) une mauvaise pratique. Alors que ce pourrait être bien pour un hors de débogage, mais en utilisant ce que
une pratique régulière peut-être pas une bonne idée.

L'utilisation de la variable d'environnement conduit à des situations comme "ça marche pour moi" quand quelqu'un
d'autre rapports de problèmes dans la base de code. Aussi on peut procéder de la même façon avec les environnement de test, ce qui entraîne des situations comme les tests en cours d'exécution fine pour un particulier développeur, mais probablement en échec lors de certains on lance les tests.

11voto

unutbu Points 222216

Avec les nombreuses autres raisons déjà mentionné, vous pouvez également le point de sud que de coder en dur

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

est fragile, car elle suppose que l'emplacement de script.py -- il ne fonctionnera que si script.py est situé dans un Projet/paquet. Il va se casser si un utilisateur décide de déplacer/copier/symlink script.py (presque) n'importe où ailleurs.

5voto

shylent Points 4590

Je pense que dans ce cas à l'aide PYTHONPATH est une chose de mieux, surtout parce qu'il n'a pas d'introduire (douteuse) inutile de code.

Après tout, si vous pensez, votre utilisateur n'a pas besoin qu' sys.path chose, parce que votre colis sera installé dans le site-packages, parce que vous serez l'aide d'un système d'emballage.

Si l'utilisateur choisit d'exécuter à partir d'une "copie locale", comme vous les appelez, puis je l'ai observé, que la pratique habituelle est de l'état, que le paquet doit être ajouté à PYTHONPATH manuellement, si utilisé à l'extérieur du site-packages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X