Question

Un autre développeur et je suis en désaccord pour savoir si PYTHONPATH ou sys.path doit être utilisé pour permettre Python de trouver un paquet Python dans un répertoire utilisateur (par exemple, le développement).

Nous avons un projet Python avec une structure de répertoire typique:

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

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

Cependant, travailler à partir d'un répertoire utilisateur, quelque chose doit d'autre à faire. Ma solution est de mettre mon PYTHONPATH d'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__))))

Alors que Python peut trouver la copie locale de package.lib.

Je pense que cela est une mauvaise idée, car cette ligne est utile 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 pour laquelle il est une mauvaise idée.

Faut-il utiliser PYTOHNPATH, sys.path, ou est soit bien?

Était-ce utile?

La solution

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

Autres conseils

Je déteste PYTHONPATH. Je trouve fragile et ennuyeux de définir sur une base par utilisateur (en particulier pour les utilisateurs de démon) et garder une trace comme les dossiers de projet se déplacer. Je mettrais bien plutôt sys.path dans les scripts Invoke pour des projets autonomes.

Cependant sys.path.append n'est pas la façon de le faire. Vous pouvez facilement obtenir des doublons, et il ne trie pas les fichiers .pth. Mieux (et plus lisible). site.addsitedir

Et script.py ne serait pas normalement l'endroit plus approprié de le faire, car il est dans le paquet que vous souhaitez mettre à la disposition sur le chemin. Les modules de la bibliothèque ne devraient certainement pas se toucher eux-mêmes sys.path. Au lieu de cela, vous auriez normalement un script hashbanged en dehors du package que vous utilisez pour instancier et exécuter l'application, et il est dans ce script wrapper trivial que vous mettiez les détails de déploiement comme sys.path-monopolise.

En général, je considérerais la mise en place d'une variable d'environnement (comme PYTHONPATH) être une mauvaise pratique. Même si cela peut être bien pour un débogage mais en utilisant de cela comme
une pratique régulière pourrait ne pas être une bonne idée.

L'utilisation de la variable d'environnement conduit à des situations comme « ça marche pour moi » quand quelqu'un
rapports autres problèmes dans la base de code. En outre on peut porter la même pratique avec le environnement de test et, ce qui conduit à des situations telles que les essais en cours d'exécution très bien pour un développeur particulier, mais ne réussiront probablement pas quand quelqu'un lance les tests.

En plus des nombreuses autres raisons déjà mentionnées, vous pouvez aussi pointer outh que coder en dur

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

est fragile car elle suppose l'emplacement de script.py - il ne fonctionnera que si script.py se trouve dans le projet / package. Il cassera si un utilisateur décide de déplacer / copier / symlink script.py (presque) nulle part ailleurs.

Je pense que, dans ce cas, l'utilisation PYTHONPATH est une meilleure chose, surtout parce qu'il ne présente pas (discutable) le code inutile.

Après tout, si vous pensez, votre utilisateur n'a pas besoin cette chose sys.path, parce que votre colis sont installées dans le site-packages, parce que vous allez utiliser un système d'emballage.

Si l'utilisateur choisit d'exécuter à partir d'une « copie locale », comme vous l'appelez, je l'ai observé, que la pratique habituelle est à l'autre, que le paquet doit être ajouté à PYTHONPATH manuellement, si elle est utilisée en dehors de la site-packages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top