Comment ajouter un chemin vers PYTHONPATH dans virtualenv


97

J'essaie d'ajouter un chemin à la variable d'environnement PYTHONPATH, qui ne serait visible qu'à partir d'un environnement virtualenv particulier.

J'ai essayé SET PYTHONPATH=...sous une invite de commande virtualenv, mais cela définit la variable pour l'ensemble de l'environnement.

Comment y parvenir?

Réponses:


155

Vous pouvez généralement éviter d'avoir à faire quoi que ce soit avec PYTHONPATH en utilisant des .pthfichiers . Mettez simplement un fichier avec une extension .pth (n'importe quel nom de base fonctionne) dans le dossier site-packages de votre virtualenv, par exemple lib\python2.7\site-packages, avec le chemin absolu vers le répertoire contenant votre package comme seul contenu.


Malheureusement, cela ne fonctionne pas comme une dérogation. Il ajoute le chemin, donc si vous développez cela ne fonctionne pas.
Erik Aronesty

De plus, si vous connaissez le chemin absolu, à quoi sert une variable?
Jamie Marshall

vous pouvez également accéder au dossier site-packages de votre environnement virtuel et créer un lien symbolique vers le fichier .pth comme ceci: ln -s path / to / somfile.pth. J'ai trouvé cela utile lorsque j'avais besoin du même répertoire pour être accessible dans plusieurs environnements virtuels
Data-phile

91

Si vous utilisez virtualenv, vous devriez probablement également utiliser virtualenvwrapper , auquel cas vous pouvez utiliser la commande add2virtualenv pour ajouter des chemins au chemin Python pour le virtualenv actuel:

add2virtualenv directory1 directory2 …


3
Que diriez-vous de supprimer de virtualenv?
silverdagger

1
Je veux ajouter un commentaire amical sur les hôtes partagés et les situations similaires, le wrapper venv n'est pas souhaité. Dans de tels cas, un seul venv est en vigueur et tout ce qui est nécessaire pour effectuer l'installation supplémentaire n'est pas souhaité. Localement, les choses sont différentes, mais sur le serveur / l'image, KISS est vraiment important.
Marc

2
Je ne sais pas comment la commande fonctionnait lorsque cela a été écrit, mais add2virtualenvne modifie pas $ PYTHONPATH, mais modifie plutôt sys.path.
ForeverWintr

1
@ajostergaard: Désolé, j'aurais dû fournir une source. Si vous regardez le code source de add2virtualenv, vous pouvez voir qu'il modifie sys.path. Je suis d'accord que la documentation donne l'impression qu'elle modifie la PYTHONPATHvariable d'environnement, mais cela semble incorrect. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr

1
@ForeverWintr Je reste corrigé - les fichiers .pth sont utilisés pour configurer sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard

5

Vous pouvez également essayer de mettre un lien symbolique vers l'un de vos virtualenv.

par exemple. 1) activez votre virtualenv 2) lancez python 3) importez sys et vérifiez sys.path 4) vous y trouverez le chemin de recherche de python. Choisissez l'un de ceux-ci (par exemple, site-packages) 5) allez-y et créez un lien symbolique vers votre package comme: ln -s chemin-vers-le-nom-de-votre-package-avec-lequel-vous-importerez

De cette façon, vous devriez pouvoir l'importer même sans activer votre virtualenv. Essayez simplement: chemin-vers-votre-dossier-virtualenv / bin / python et importez votre package.


Je suppose que cela a été critiqué pour l'utilisation de liens symboliques plutôt que de fichiers .pth. Cela a fonctionné pour moi, donc, whavever.
Gareth Davidson

3

Si vous utilisez virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

la console affichera

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Ça y est, et tu devrais être prêt à partir


1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Je vous suggère fortement d'utiliser virtualenv et virtualenvwrapper pour éviter d'encombrer le chemin.


si vous voulez que cela fonctionne avec n'importe quelle version de python, utilisez simplement un format de chaîne de style ancien plutôt que la f-string fantaisie f "... {dir_path}"
Guillaume S

Merci pour le commentaire. J'ai révisé pour utilisation. les anciennes méthodes sont encombrantes et idiosyncratiques et il n'y a rien d'extraordinaire à un système de modélisation simple
Rubber Duck

Tout est relatif :)
Guillaume S
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.